libro
www.tuyano.com
初心者のためのCakePHP3 プログラミング入門

複数テーブルの連携 (1/5)

作成:2015-10-24 09:11
更新:2015-10-24 09:11

■関連付けとアソシエーション

データベースというのは、1つのテーブルだけで完結するわけではありません。むしろ、複数のテーブルが関連付けられて呼び出されることのほうが多いものです。こうした場合のために、「アソシエーション」と一般に呼ばれる機能が用意されています。

これは、あるテーブルと別のテーブルがどのような関係にあるかを示すための機能です。このアソシエーションには、いくつかの関連付けがあります。ざっと整理すると以下のようになるでしょう。

●has One
あるテーブルのレコードと、別のテーブルのレコードがそれぞれ「1対1」の関係で関連付けられている、という場合です。例えば、町の住民のテーブルと、図書館の利用者登録テーブルといったものを考えてみましょう。図書館の利用者テーブルにあるレコードは、必ず住民テーブルにあるレコードと1対1で関連付けられます。ある図書館の利用者が、複数の住民に関連付けられていることはありません。つまり、「図書館の利用者テーブルは、住民テーブルとhas Oneの関係にある」というわけです。

この関係は、逆の立場から見ると必ずしも成立するわけではありません。つまり、住民は、必ず図書館の利用登録をしているわけではないので、住民テーブルのレコードの中には、図書館利用者テーブルと関連付けられていないものもあります。アソシエーションは、「どちらを主にして関係を考えるか」が重要なのです。この例の場合、「図書館利用者テーブル」が主で、これに「住民テーブル」が関連付けられている、と考えるわけですね。

●has Many
これは、「1対多」の関係です。あるテーブルのレコードに、別のテーブルにある複数のレコードが関連付けられる、という場合です。例えば、図書館の利用者テーブルと、図書のテーブルを考えてみましょう。利用者は、一度に何冊でも本を借りられますから、ある利用者のレコードには、いくつもの図書データが関連付けられているはずです。

●belongs To
これは「多対1」の関係です。has Manyを逆方向から見ると「belongs To」の関係になります。つまり、あるテーブルにある複数のレコードが、別のテーブルの同じレコードに関連付けられる、という場合です。図書データにある多数のレコードが、利用者テーブルの一人のレコードに関連付けられる、ということですね。

●belongs To Many
 これは「多対多」の関係です。あるテーブルにある複数のレコードが、別のテーブルの複数のレコードに関連付けられる、というものですね。例えば、図書館の利用者テーブルと、本の貸出記録テーブルを考えてみましょう。ある利用者は、何冊もの本の貸出記録があるでしょうし、ある本はそれまで何人もの利用者にも貸し出されています。このように、お互いが複数の相手と関連する場合にこれが用いられます。

この4つのアソシエーション「1対1」「1対多」「多対1」「多対多」が、テーブルの関連付けの基本となります。これは、CakePHPの機能というわけではなく、データベースを利用するすべての場合で用いられている考え方ですから、ここでしっかりと覚えておきましょう。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

※下図は、今回作成する、has many/belongs toで関連付けられた
membersとmessagesの例。membersから、その人が投稿したmessagesの
投稿が関連付けられ表示されている。
(ただし、今回はここまで作成しません)

※関連コンテンツ

「初心者のためのCakePHP3 プログラミング入門」に戻る