如何在Yii2 Active Record中使用JOIN作为关系模型?

时间:2015-04-04 14:26:03

标签: php mysql activerecord yii2

我有2个名为Books and Reviews的表。 Books表与Reviews有一对多的关系。

我想搜索图书并按评论对其进行排序。

例如,如果有10本书可用且书籍已在评论中进行审核,那么我想通过使用WHERE子句查找所有书籍并计算评论,然后根据评论编号订购所有书籍。

我的SQL查询如下:

 Books::find()
   ->where([
     'and', 
     ['like', 'books.bookName', $bookName],
     ['like', 'books.status', 'Enabled'] 
    ])
  ->joinWith(['reviews' => function ($q){
        $q->select(['COUNT(*) as cnt']);
    }])
  ->orderBy(['cnt' => 'DESC'])
  ->all();

它给了我以下错误消息:

  

SQLSTATE [42S22]:未找到列:1054未知列' cnt'在'订单条款'

我在这里缺少什么?

1 个答案:

答案 0 :(得分:8)

使用joinWith。更多see

例如,对于您的案例代码:

Books::find()
    ->joinWith(['reviews' => function ($q) {
        $q->select(['COUNT(*) as cnt']);
    }])
    ->orderBy(['cnt' => 'DESC'])
    ->all();

编辑: 我找到更好的解决方案

Books::find()
    ->joinWith(['reviews'])
    ->select(['*', 'COUNT(reviews.*) as cnt'])
    ->groupBy('RELATION_FIELD(Example: reviews.book_id)')
    ->orderBy(['cnt' => 'DESC'])
    ->all();