😎

CakePHP5 アソシエーションの方法 複数カラムから 同じテーブルへ

2024/01/24に公開

カラム名を [モデルの単数形]_id とすると 、bake でサクッとアソシエーションのコードを作ってくれますが、ルールから外れるとコード作ってくれません。(そりゃそうだ;)

例えば スタッフ(staffs) が バーガー(burgers)を焼いて包む場合

テーブル名:burgersカラム:id, grilled_staff_id, packed_staff_id, created, modified

テーブル名:staffsカラム:id, name, create, modified

(はい。お腹すいてます。。ごはん前です。。)

<?= $burger->grilled_staff->name ?> ←エラー!
<?= $burger->packed_staff->name ?> ←エラー!

としたいけどどうする?!

アソシエーションを設定する方法はこちら。https://book.cakephp.org/5/ja/orm/associations.html#id1

...理解するまで時間がかかったのでこの記事書いてます。

解決方法はこちら!

src/Model/BurgersTable.php
    public function initialize(array $config): void
    {
        ...

        $this->belongsTo('GrilledStaffs',[
            'className' => 'Staffs',
            'foreignKey' => 'grilled_staff_id',
            'joinType' => 'INNER',
            'property' => 'grilled_staff',   /* このカラム名だと省略可 */ 
        ]);
        $this->belongsTo('PackedStaffs',[
            'className' => 'Staffs',
            'foreignKey' => 'packed_staff_id',
            'joinType' => 'INNER',
            'property' => 'packed_staff',   /* このカラム名だと省略可 */ 
        ]);
        
        ...

コントローラー

$burger = $this->Burgers->get($id, contain: ['GrilledStaffs', 'PackedStaffs']);

ビュー

<dl>
    <dt>バーガーを焼いたスタッフ</dt>
    <dd>
        <?= $burgers->hasValue('grilled_staff') ? h($burgers->grilled_staff->name) : '' ?>
    </dd>
    <dt>バーガーを包んだスタッフ</dt>
    <dd>
        <?= $burgers->hasValue('packed_staff') ? h($burgers->packed_staff->name) : '' ?>
    </dd>
</dl>

Discussion