複数テーブルの連携 (1/5)
作成:2015-10-24 09:11
更新: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の機能というわけではなく、データベースを利用するすべての場合で用いられている考え方ですから、ここでしっかりと覚えておきましょう。
これは、あるテーブルと別のテーブルがどのような関係にあるかを示すための機能です。このアソシエーションには、いくつかの関連付けがあります。ざっと整理すると以下のようになるでしょう。
●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の機能というわけではなく、データベースを利用するすべての場合で用いられている考え方ですから、ここでしっかりと覚えておきましょう。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
※下図は、今回作成する、has many/belongs toで関連付けられた membersとmessagesの例。membersから、その人が投稿したmessagesの 投稿が関連付けられ表示されている。 (ただし、今回はここまで作成しません)
※関連コンテンツ
「初心者のためのCakePHP3 プログラミング入門」に戻る