LoginSignup
0
0

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

Posted at

カラム名を [モデルの単数形]_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>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0