CakePHP3で多対多のテーブルからデータを取り出す方法をめもめも 🙂
CakePHP3ではjoin関数を使う方法もあるようですが、
この記事ではCakePHP ORMクエリー関数を利用しています。
[peg-image src=”https://lh3.googleusercontent.com/-dX6MfcDoH1w/WTU5rKHAoXI/AAAAAAAAApo/AL2TCXpnLFkI8-tCDkzm_3p_6V7CTXzHQCCo/s144-o/cakephp3-habtm.png” href=”https://picasaweb.google.com/101694633015118628628/6414447919756879953#6428107456752165234″ caption=”” type=”image” alt=”cakephp3-habtm.png” image_size=”390×115″ ]
今回は上記のようなDBを使います。
Model/Tableの定義
多対多の中間テーブルのinitializeにアソシエーションを定義します。
<?php namespace App\Model\Table; use Cake\ORM\Table; use Cake\ORM\Query; class PostTagsTable extends Table { public function initialize(array $config) { $this->belongsTo('Posts'); $this->belongsTo('Tags'); } } ?>
上記はPostsテーブルとTagsテーブルの中間テーブル、
PostTagsテーブルのModelです。
CakePHP2で使われていたhasAndBelongsToManyは、
belongsToに名前が変わったことに注意してください。
中間テーブルの利用
Controllerから中間テーブル、PostTagsテーブルを利用してみます。
<?php namespace App\Controller; use App\Controller\Controller; use Cake\ORM\TableRegistry; class PostsController extends Controller { public function index() { $query = TableRegistry::get( 'PostTags' ); $datas = $query->find( 'all', [ 'contain' => [ 'Posts', 'Tags' ] ]); $this->set( 'datas', $datas ); } } ?>
上のコードでは、
変数datasの中にPostsテーブルとTagsテーブルを結合したデータが入ります。
下記のようにViewでデータを取り出せます。
<?php foreach( $datas as $data ): ?> <?php echo $data['posts']['name']; ?> <?php echo $data['tags']['name']; ?> <?php endforeach; ?>