【CakePHP】ページネーションでjoinする方法

こんちには、フリーのITエンジニアでWeb(PHP:Laravel)のバッグエンドをメインにフルリモートでお仕事させて頂きながら、個人開発でiOSアプリを作っているMoritaです。

Model::find()でjoinする場合、ページネーションを実装するのが困難になります。
ページネーションとjoinを組み合わせるためには、paginateプロパティでjoinを設定していきましょう。

Model::find()のなにがダメ?

以下のソースでページネーションを実行しても取得できるのArticleテーブルのデータだけで、Commentsテーブルの値は取れません。

$query = $articles->find()
    ->join([
        'table' => 'comments',
        'alias' => 'c',
        'type' => 'LEFT',
        'conditions' => 'c.article_id = articles.id',
    ]);

// これだとcommentテーブルの値は取れません。
$this->set('article', $this->paginate());

どうすればいいんだ?

paginateプロパティのjoinで取れます。

// ArticleControllerのpaginateプロパティ
// 対応したModelはArticleになります。
$this->paginate = array(
    'join' => array(
        'type' => 'left',
        'tabel' => 'comment',
        'conditions' => array(
            'comment.id = article.id',
        )
    )
); 

まとめ

ページネーションを使用する場合、コントローラのpaginateプロパティのjoin で実装しましょう。

コメント

タイトルとURLをコピーしました