こんな需要があるのかどうかわからないのですが、実験していて出来たので共有です
前提条件
データ
posts
というブログの記事を管理するテーブルと、
post_images
という記事に対してアップロードした画像を管理するテーブルがあるとしましょう:
posts
id | title |
---|---|
1 | 新型のレクサスLSを試乗してきました |
2 | ステップワゴンスパーダ(ハイブリッド)を試乗してきました |
post_images
id | filename | post_id |
---|---|---|
1 | LS外観.jpg | 1 |
2 | LS内装.jpg | 1 |
3 | スパーダ外観.jpg | 2 |
4 | スパーダ内装.jpg | 2 |
5 | スパーダエンジンルーム.jpg | 2 |
得たい結果
この2つのテーブルを一回で持ってきて、かつ、filename
のカラムを抜き出したいとします。
つまり次のデータが欲しいとします:
LS外観.jpg LS内装.jpg スパーダ外観.jpg スパーダ内装.jpg スパーダエンジンルーム.jpg
動くケース
matchingとextractを使う場合
$posts = $this->Posts->find() ->matching('PostImages') ->extract('_matchingData'); foreach($posts as $post){ echo $post['PostImages']->filename; }
matchingとselectを使う場合
$posts = $this->Posts->find() ->matching('PostImages') ->select(['id','PostImages.post_id','PostImages.filename']); foreach($posts as $post){ echo $post->_matchingData['PostImages']->filename; }
leftJoinWithとselectを使う場合
$posts = $this->Posts->find() ->leftJoinWith('PostImages') ->select(['PostImages.filename']) ->all(); foreach($posts as $post){ echo $post->_matchingData['PostImages']->filename; }
動かないケース
containでextractもしくはselectを使う場合
やり方がわかりませんでした。 containはjoinをしないで、できないのか?
leftJoinWithとextractを使う場合
やり方がわかりませんでした。