Every Qiita #20
のんびり独学初学者の毎日投稿チャレンジ 20日目
今回は・・・
cakephpでリレーション先のテーブルデータを取得した時の備忘録です。
modelでリレーションを設定する
公式チュートリアルの例に倣ってusersテーブルとarticlesテーブルで1対多のリレーションを設定してみます。
外部キーはuser_idです。
public function initialize(array $config): void
{
parent::initialize($config)
$this->hasMany('Articles',[
'foreignKey'=>'user_id',
'dependent'=>true,
]//foreignKeyはデフォルトで`テーブル名_id`
}
public function initialize(array $config): void
{
parent::initialize($config)
$this->belongsTo('Users',['foreignKey'=>'user_id']//foreignKeyはデフォルトで`テーブル名_id`
}
今回は外部キーがuser_idですので省略可能です。テーブル名_id以外でキーを設定する場合は任意で設定してください。
'dependent'
をtrueに設定することで、再帰的にモデルを削除することができます。今回は特定のuserが削除されると、それに関連するarticlesも削除されます。
controllerでリレーション先のテーブルも取得する
今回はgetメソッドオプションのcontain
を使って取得します。
一意のuser情報と関連するarticlesを一覧表示するためのクエリを設定します。
public function view($id = null)
{
$user = $this->Users->get($id, ['contain' => ['Articles']]);
$this->set(compact('user'));
}
これでuserと関連するarticlesが取得できました。
viewで表示する時はforeachを使って表示します。
foreach($user->articles as $article){
echo $article->articlesテーブルの任意カラム
}
リレーション先のモデル名は大文字頭文字ですが、viewでは小文字ですので注意が必要です。