Yii2。如何按联结 table 中的属性对结果进行排序?
Yii2. How to sort results by attributes in junction table?
我有 3 个 table:sp_pages
、sp_messages
和 sp_messages_pages
(用于多对多关系)。
sp_messages_pages
table 有 5 列:
- id
- page_id
- message_id
- 启用
- sorting_order
我想使用 Yii2 框架 sp_messages_pages.sorting_order
获取特定页面排序的所有消息。
我在 pages
class:
中尝试此代码
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
WHERE id
IN ('2', '3', '1', '4', '5')
IN
条件按我想要的排序,但是sp_messages
如何排序?
第一种方式——将关系 table 连接到已选择的 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 中的关系,只是 returns ActiveQuery
进一步工作的一种方法。例如,您可以使用$page->getMessages()->all()
这样的方法。
我有 3 个 table:sp_pages
、sp_messages
和 sp_messages_pages
(用于多对多关系)。
sp_messages_pages
table 有 5 列:
- id
- page_id
- message_id
- 启用
- sorting_order
我想使用 Yii2 框架 sp_messages_pages.sorting_order
获取特定页面排序的所有消息。
我在 pages
class:
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
如何排序?
第一种方式——将关系 table 连接到已选择的 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 中的关系,只是 returns ActiveQuery
进一步工作的一种方法。例如,您可以使用$page->getMessages()->all()
这样的方法。