こんにちは、この度会社公認サークルとして映画鑑賞サークルが設立されました。月一回映画を見に行く予定です。
10月から活動開始しますので、映画を見るのが好きな方、気になる方はぜひお声がけください。いつでもメンバー募集しております!
cakePHP3 アソシエーション
今回は業務で使用したデータベース周りの仕組み、アソシエーションについてです。
アソシエーションは直訳すると「関連」という意味があり、データベース絡みの文脈で言うアソシエーションはテーブル間の関連性を意味しています。
データベースから一つのテーブルのデータを持ってくるのではなく、関連する複数のテーブルからデータを取ってくる際に必要になります。
具体的には以下の4つがあります。
- hasOne (1:1)
どちらもuser_idという同じキーをプライマリーキーにしており、各レコードが1:1で対応している場合に用います。
user_id | name |
1 | A |
2 | B |
user_id | food | color |
1 | イカ | 赤 |
2 | タコ | 青 |
- hasMany(多:1)
usersテーブルとadditionsテーブルがあるとします。プライマリーキーはuser_idです。usersテーブルのuser_id一つに対して、additionsテーブルにはuser_idに対応するレコードが複数あります。
id | name |
1 | A |
2 | B |
id | user_id | food |
1 | 1 | イカ |
2 | 1 | タコ |
3 | 2 | エイ |
- belongsTo(1:多)
hasManyと逆で、additionsテーブルのすべてのレコードは、usersテーブルのいずれかのレコードに属している状態にしたい時はこちらを使います。
- belongsToMany(多:多)
最後にどちらも複数であればこちらになります。
使いたいテーブルのファイル(例:UsersTable.php)のpublic function initialize(array $config)の中に以下のように書いておけば使えるようになります。
$this->hasMany('Additions', [
'foreignKey' => 'user_id',
'dependent' => true,
]);
$this->belongsTo('Stocks', [
'foreignKey' => 'stock_id',
]);
使う時のメソッドは以下のような感じです。
public function findStock(Query $query, array $options)
{
$query->select([
'id',
'login_id',
'word',
])->contain([
'Stocks' => [
'fields' => [
'id',
'name',
'number',
]
]
]);
return $query;
}