我有3个表:sp_pages
,sp_messages
和sp_messages_pages
(适用于多对多关系)。
sp_messages_pages
表有5列:
我想通过sp_messages_pages.sorting_order
使用Yii2框架获取特定页面排序的所有消息。
我在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]);
});
}
我在我的控制器中使用此代码:
$this->findModel(['slug' => $slug])->getMessages();
这给了我按sp_message.id
排序的所有邮件。生成的SQL是
SELECT * FROM
sp_messages
WHEREid
IN('2','3','1','4','5')
IN
条件按我的意愿排序,但如何排序sp_messages
?
答案 0 :(得分:0)
第一种方式 - 将关系表加入已选定的messages
$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]);
这里几乎是同一个问题:Yii2 order items of many-to-many relation
其他方式 - 使用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]);
但这不是Yii therms中的关系,只是一种返回ActiveQuery
以进行进一步工作的方法。例如,您可以使用$page->getMessages()->all()
等方法。