我有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'在'订单条款'
我在这里缺少什么?
答案 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();