sort data custom column sorting yii2 many-to-many

sorting - data - yii2 search model



Yii2. ¿Cómo ordenar los resultados por atributos en la tabla de unión? (1)

Tengo 3 tablas: sp_pages , sp_messages y sp_messages_pages (para relaciones de muchos a muchos). La tabla sp_messages_pages tiene 5 columnas:

  • carné de identidad
  • page_id
  • message_id
  • habilitado
  • sorting_order

Deseo obtener todos los mensajes para la clasificación de páginas específica por sp_messages_pages.sorting_order usando Yii2 framework.

Intento este código en la clase de pages :

public function getMessages() { return $this->hasMany(Messages::className(), [''id'' => ''id_messages'']) ->viaTable(''sp_messages_pages'', [''id_pages'' => ''id''], function ($query) { $query->andWhere([''enabled'' => ''Yes'']) ->orderBy([''sp_messages_pages.sorting'' => SORT_ASC]); }); }

Yo uso este código en mi controlador:

$this->findModel([''slug'' => $slug])->getMessages();

Esto me da todos los mensajes ordenados por sp_message.id . El SQL generado es

SELECCIONAR * FROM sp_messages WHERE id IN (''2'', ''3'', ''1'', ''4'', ''5'')

IN se clasifica como quiero, ¿pero cómo ordenar sp_messages ?


Primera forma: unir la tabla de relaciones con los messages ya seleccionados

$this->hasMany(Messages::className(), [''id'' => ''id_messages'']) ->viaTable(''sp_messages_pages'', [''id_pages'' => ''id''], function ($query) { $query->andWhere([''enabled'' => ''Yes'']); } ) ->leftJoin(''sp_messages_pages MP'', ''MP.id_messages = sp_messages.id'') ->orderBy([''MP.sorting'' => SORT_ASC]);

casi la misma pregunta aquí: elementos de orden Yii2 de relación muchos a muchos

De otra manera, utilizando findBySql

$sql = " SELECT m.* FROM sp_messages AS m JOIN WITH sp_messages_pages AS mp ON mp.id_messages = m.id JOIN WITH sp_pages AS p ON p.id = mp.id_pages WHERE mp.enabled = ''Yes'' AND p.id = :page_id ORDER BY mp.sorting ASC "; return Messages::findBySql($sql, ['':page_id'' => $this->id]);

pero esto no será una relación en termias Yii, solo un método que devuelve ActiveQuery para un trabajo posterior. Puede usar un método como $page->getMessages()->all() por ejemplo.