😎
CakePHP5 アソシエーションの方法 複数カラムから 同じテーブルへ
カラム名を [モデルの単数形]_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