web-dev-qa-db-ja.com

リレーショナルモデルのYii2 Active RecordでJOINを使用する方法

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'が不明です

ここで何が欠けていますか?

8
The Coder

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();
9
vitalik_74