Yii2。如何按联结表中的属性对结果进行排序?

时间:2016-07-20 13:30:41

标签: sorting yii2 many-to-many

我有3个表:sp_pagessp_messagessp_messages_pages(适用于多对多关系)。 sp_messages_pages表有5列:

  • ID
  • PAGE_ID
  • MESSAGE_ID
  • 启用
  • sorting_order

我想通过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 WHERE id IN('2','3','1','4','5')

IN条件按我的意愿排序,但如何排序sp_messages

1 个答案:

答案 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()等方法。