2019-10-03Laravelでテーブルのリレーションを定義するhasManyとbelongsToの理解に時間がかかったので、整理がてらまとめてみました。さんは、たくさんの本を書いています。1人の小説家が、多数の本を書いている」これが「1対多」の関係です。テーブルとサンプルデータの作成2つのテーブルを作成します。著者の情報を格納するテーブル:authors本のタイトルを格納するテーブル:books各テーブルのカラムとレコードを下記のように作ります。テーブルとモデルのマッピング「モデル」とは、テーブルの内容を定義したクラスです。モデルをテーブルに紐づけることで、テーブル操作が簡単にできます。テーブルのカラム(フィールド)を、プロパティとして持たせているので、テーブルをインスタントして扱うことができます。1つのテーブルにつき、1つのモデルが紐づきます。Laravelにはテーブルとモデルを紐づける命名規則があります。Laravelでは、「テーブル」と「モデル」を自動でマッピングするための命名規則があります。モデル名=単数形/テーブル名=複数形で命名すると、自動でマッピングされます。(例)モデル名=Bookテーブル名=booksこの命名規則を破ったネーミングにする場合、特別な記述をするとマッピングできます(この方法は当記事ではふれません)たとえば、「people」という名前でテーブルを作成した場合、それに紐づけるモデル名は「Person」です。Personはpeopleの単数形ですからね!(むずかしい!)Laravelの命名規則に従い、テーブルとモデルを作成します。Bookモデルリレーション元・リレーション先テーブルにリレーションがある場合、リレーション元(主)・リレーション先(従)という考え方をします。リレーション元テーブル=authorsテーブルリレーション先テーブル=booksテーブルこれもLaravelの命名規則があります。リレーション元モデルのidカラムリレーション先モデルの、[リレーション元モデル名_id]カラムこの規則により、2つのテーブルはこのような関係になります。リレーションを定義するメソッド【1対多】のリレーションを定義するメソッドがあります。【1対多】の逆向きのリレーションを定義する→【多】側で定義する(Bookモデル)う~ん、なんかいまいちピンとこないなぁ~もりまずは英語の復習からいくよ~!hasManyのイメージ“has”は、~を持っているという意味の動詞”have”の三人称単数形です。もりポイントは単数形だよ!池井戸潤さんも、本をたくさん書いていますね。「1:多」の関係です。belongsToのイメージ【1対多】の関係を、【多】である「本」の立場から見てみましょう。「本」は、かならず、ひとりの著者に所属します。『白夜行』というタイトルの本は、「東野圭吾」さんの本です。『容疑者Xの献身』というタイトルの本も、「東野圭吾」さんの本です。『七つの会議』というタイトルの本は、「池井戸潤」さんの本です。これが【1対多】の「逆向きのリレーション」の考え方です。下記のコマンドでAuthorモデルとBookモデルを作成します。successfully.app配下に、Author.phpとBook.phpが作成されます。Authorモデル(hasMany結合)hasManyメソッドを使用して、Bookモデルと【1対多】のリレーションを定義します。$this->hasMany(Book::class);}}Bookモデル(belongsTo結合)belongsToメソッドを使用して、Authorモデルと【1対多】の逆向きのリレーションを定義します。$this->belongsTo(Author::class);}}これで、AuthorモデルとBookモデルに「リレーション」ができました。動作確認用にテーブルにデータを作成します。|+----+-----------+-----------------------------+tinkerを起動して名前空間を定義します。App\Authorbooksテーブル:id(7)の本の著者を取得するbooksテーブルのid=7は『七つの会議』です。『七つの会議』の著者は「池井戸潤」です。"池井戸潤"想定どおり「池井戸潤」が取得できました。コードを詳しくみてみましょう。1Book::find(7)Bookモデルはbooksテーブルに紐づいています。Bookモデルを通して、booksテーブルのid=7のレコードを取得します。2Book::find(7)->authorBookモデルに定義したauthorメソッドを呼び出します。【1対多】の逆向きリレーション(belongsTo)で、authorsテーブルのレコードが取得できます。※「authorsテーブルのid」と「booksテーブルのauthor_id」が紐づいていましたね3Book::find(7)->author->nameAuthorモデルのnameプロパティを取得します。これは、authorsテーブルのnameカラムです。これが、リレーションを使用した値の取得方法です。authorsテーブル:id(1)の著者の本の一覧を取得するauthorsテーブルのid=1は「東野圭吾」です。著者が「東野圭吾」の本をすべて取得します。"夢幻花",},],}コードをみていきましょう。1Author::find(1)Authorモデルはauthorsテーブルと紐づいています。Authorモデルを通して、authorsテーブルのid=1のレコードを取得します。2Author::find(1)->booksAuthorモデルに定義したbooksメソッドを呼び出します。Authorに紐づくすべてのbookを取得します。このように、テーブルリレーションを定義することで、テーブルのCRUD操作が簡単にできるのです。もりさんのプログラミング。