CakePHP3で多対多テーブルからデータを取得する方法

CakePHP3で多対多のテーブルからデータを取り出す方法をめもめも 🙂

CakePHP3ではjoin関数を使う方法もあるようですが、
この記事ではCakePHP ORMクエリー関数を利用しています。

cakephp3-habtm.png

 今回は上記のような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; ?>

参考