hasManyとbelongsToについてまとめてみた。
この概念の理解を深めていくと、モデルからデータを取ってくる時の効率がだいぶ良くなると思う。
hasManyとは
文字通り、"have":「持っている」、"many":「いっぱい」から、「いっぱい持っている」の意味。
つまりどういうことかというと、あるテーブルの一つのデータが別のテーブルの複数のデータを持っているということになる。
身近な例で例えるとするならば、”先生はたくさんの生徒を持っている”みたいなもんだ。
これを英語に直すと、"A teacher has many students."になる。
belongsToとは
"belong":「所属する」、"to":「〜に対して」から、「〜に対して所属する」の意味になる。
これは、あるテーブルの一つのデータは別のテーブルの一つデータに所属しているということを意味する。
先ほどの続きで例えると、”ある生徒は先生に所属している”、
つまり、"A studenst belongs to a teacher."になる。
つまり、hasManyとBelongsToの関係は・・・
要は対になっているということだ。
テーブルAのデータがテーブルBの複数のデータに紐付いているということは、
テーブルBのそれぞれのデータがテーブルAのいずれか一つのデータに関連付けられている
ということになる。
実装
テーブル定義
テーブルとして"teachers"と"students"を用意する、それぞれのカラム名は以下の通り。
teachers
カラム名 | 型 | 例 |
id | int(unsigned) | 1 |
name | varchar(255) | Mr.saito |
students
カラム名 | 型 | 例 |
id | int(unsigned) | 1 |
name | varchar(255) | suzuki |
teacher_id | int(unsigned) | 1 |
また、外部キーの設定は以下の通り。
"students.teacher_id" = "teachers.id"
コード
以下、CakePHP(version 2.x)のモデル定義の実装例
teachersテーブル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php App::uses('AppModel', 'Model'); class Teacher extends AppModel { public $name = 'Teacher'; public $useTable = 'teachers'; public $hasMany = [ 'Student' => [ 'className' => 'Student', ] ]; } |
studentsテーブル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php App::uses('AppModel', 'Model'); class Student extends AppModel { $name = 'Student'; $useTable = 'studentes'; $belongsTo = [ 'Teacher' => [ 'className' => 'Teacher', 'foreignKey' => 'teacher_id' ] ]; } |