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"
]
);