2016-07-20 70 views
1

我有3个表格:sp_pages,sp_messagessp_messages_pages(用于多对多关系)。 的sp_messages_pages表有5列:Yii2。如何根据联结表中的属性对结果进行排序?

  • 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

+0

检查此问题http://stackoverflow.com/questions/38355984/yii2-order-items-of-many-to-many-relation/38367858相同的主题 – oakymax

回答

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

+0

我很抱歉,关系表名称是'sp_messages_pages'。不幸的是,你的代码不适合我,bot我开始通过+加入研究。 – Psyhos

+0

@Psyhos你也可以尝试使用'findBySql'方法:http://www.yiiframework.com/doc-2.0/yii- db-activerecord.html#findBySql() - 详细信息 – oakymax

+0

@Psyhos为什么不起作用?这里有一些错误? – oakymax

相关问题