cakephp3.xbelongstohasmanyfind

2016年8月15日更新 view: 21 view
https://avatars.githubusercontent.com/u/8245683?v=3

mysqlをアソシエーションしたいな

cakephp2.xの時と若干違い、戸惑う。
今回は
・belongsTo
・hasMany
のfindに的を絞って解説。

条件

ユーザーテーブル 1 に対し、
ソーシャルテーブルは 0 もしくは 1。

ソーシャルテーブルからユーザー情報を抜き出す

ソーシャルテーブルは 複
ユーザーテーブルが 単

よって、今回はbelongsTo。

SocialsTable.php

class SocialsTable extends AppTable
{

public function initialize(array $config)
{
$this->belongsTo('Users', [
'foreignKey' => 'user_id'
]);
}

}

これでひも付け完了。

早速情報を読みだしてみよう。

$this->Socials = TableRegistry::get('Socials');
$res = $this->Socials->find()->where(['Socials.user_id' => 15])->contain(['Users'])->first();
pr($res);

echo $res->user->email;

これでユーザーのデータをひも付けて取得することができる。
コツはこの contain(['Users'])をやらないとひも付けてあっても関連データを取得できない
ということ。

フィールドを絞り込みたい

this->Socials = TableRegistry::get('Socials');
$res = $this->Socials->find()->where(
['Socials.user_id' => 15]
)->contain([
'Users'
])
->select(['id','user_id','Users.id','Users.email'])//フィールドを絞り込む
->first();
pr($res);

echo $res->user->email;
スポンサードリンク

こんな感じでselectを追加すればいけます。

続いてhasmany

UsersTable.php

public function initialize(array $config)
{
$this->hasMany('Socials', [
'foreignKey' => 'user_id'
]);
}

UsersController.php

$user = $this->Users->find()
->where(['id' => 15])
->contain('Socials')
->first();

pr($user);

allしたい場合

$user = $this->Users->find()
->contain('Socials')
->all();

pr($user);

動的にアソシエーションを追加したい場合は
適当なコントローラーで

$this->Users->hasMany('Socials', [
'foreignKey' => 'user_id',
]);

$user = $this->Users->find()
->contain('Socials')
->all();

pr($user);
スポンサードリンク

関連記事

関連カテゴリ