[cakephp3]query::joinでもカラム全取得したい!

2016-06-24


cakephp3のqueryオブジェクトが持つ関数contain()、とても便利です。それはもう、いたるところで使ってます。
containの説明は公式をご覧ください。

ただ、このcontain()、テーブルをjoinするとき、inner joinになるんですよね@mysql。
時にはleft joinをしたいです。
そんな時にはjoin()とかleftJoin()、leftJoinWith()なんかを使えばOK。

ただ、ただ!join系列はcontainと違って、joinだけで、カラムの指定はしてくれない(と認識してます)。containだと自動で全カラム、ご丁寧にぶつからないようにエイリアス付きなqueryを作ってくれるのですが、、、

そこで今回の話題。カラム指定を以下に楽にするか!それはjoinとcontainを併用すれば達成できます!
たとえば関連するtable_aと、そのtable_aに関連するtable_bをjoinして、全カラム取得する場合は↓


$query->find()
      ->joinLeftWith("table_a.table_b")
      ->contain(["table_a" => ["table_b"]);

これでinnerだろうがleftだろうが、rightだろうが、好きにjoinして、カラムを取得できます!

join先はそんなにいらない!というなら、selectでカラムを指定する方法もあります。ご都合に応じてどうぞ。


$query->find()
      ->joinLeftWith("table_a.table_b")
      ->select(["table_a.id",
                "table_b.id"
               ]
      );