Books and Reviewsという2つのテーブルがあります。 Booksテーブルは、レビューと1対多の関係にあります。
書籍を検索し、レビューで並べ替えたい。
たとえば、利用可能な書籍が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 'order句'の列 'cnt'が不明です
ここで何が欠けていますか?
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();