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
WHEREid
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.