2016-03-24 12 views
21

hasManyのEloquentの関係がbelongsToManyとは異なる署名をしているのはなぜか不思議です。具体的には、与えられたCommentが多くのRoleに属し、与えられたRoleがたくさんあるシステムのカスタム結合テーブル名はであり、その関係をmy_custom_join_tableというテーブルに格納し、そのキーをcomment_keyおよびrole_keyhasManyとlaravel 5.xのbelongsToManyとの比較

return $this->belongsToMany('App\Role', 'my_custom_join_table', 'comment_key', 'role_key'); // works 

しかし逆に、私は(少なくともドキュメントはそれを言及していない)そのカスタムテーブルを定義することはできません。

return $this->hasMany('App\Comment', 'comment_key', 'role_key'); 

私はhasManyCommentsそのRoleオブジェクトを持っている場合は、しかし、私はその関係を格納するために非標準のテーブル名を使用しますが、なぜこの非標準のテーブルを一方向に使うことができますか?

+0

双方向多対多の関係の逆は多対多ではなく、一対多です。 Doctrineには、[すべての関係命令の素晴らしいプレゼンテーション]があります(http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#many-to-many-bidirectional )とその実装。 – bishop

+0

公式文書には、Eloquentリレーションシップに関する非常に良い記事があります。 – user3158900

答えて

64

hasManyOne To Manyの関係で使用され、belongsToManyMany To Manyの関係を参照します。これらはどちらも異なる関係タイプであり、それぞれ異なるデータベース構造を必要とするため、異なるパラメータを使用します。

重要な違いは、1対多の関係では、関連するモデルに対応する2つのデータベーステーブルのみが必要な点です。これは、リレーションへの参照が所有モデルのテーブル自体に格納されているであるためです。たとえば、CountryモデルとCityモデルがあります。国には多くの都市があります。しかし、各都市はある国にのみ存在します。したがって、都市モデル自体にという国を保存すると、country_idなど)となります。

しかし、多くの関係に多くのデータベーステーブルを必要とする、ピボットテーブルと呼ばれます。ピボット・テーブルは、両方のモデルへの参照を格納し、関係宣言の第2パラメータとして宣言することができます。たとえば、Cityモデルがあり、Carモデルもあるとします。あなたは、人々が各都市で運転する自動車の種類を示す関係を欲しがります。まあ、ある都市で人々は多くの車の異なるタイプのを運転します。しかし、あなたが1台の車のタイプを見るなら、それは多くの異なる都市ので動くことができることも知っています。したがって、どちらのモデルにも複数のモデルがあるため、いずれのモデルにもcity_idまたはcar_idを格納することは不可能です。したがって、それらの参照をピボットテーブルに配置します。経験則として

あなたがbelongsToMany関係を使用している場合、それはだけ別のbelongsToMany関係と対になって、あなたが第三のピボットテーブルを持っていることを意味することできます。 hasManyの関係を使用する場合は、のペアのみをbelongsToの関係にすることができ、余分なデータベーステーブルは必要ありません。

例では、逆の関係をbelongsToManyにして、カスタムテーブルを外部キーとローカルキーとともに追加します(他のモデルからの順序を逆にする)。

+1

シンプルで完全な効率的な –

+0

非常にきれいで便利な説明です! – Andy

+0

完璧な説明 –

13

テキストや図で理解してください。ワン(hasOneの)関係に

  1. ワン:

    • ユーザが(持つことができる)のプロファイルを有しています。したがって、プロファイルは1人のユーザーに属します。
  2. 一つ多く(hasManyの)へ:

    • ユーザーが多く(多くを持つことができます)記事が掲載されています。したがって、多くの記事は1人のユーザーに属しています。
    • (BelongsToMany)多くの多くの
    • ユーザーは多くのフォーラムに属することができます。だから、フォーラムは多くのユーザーに属しています。

    RelationShip

+0

hasOne/belongsToの場合、hasOneは関連するテーブルへの参照を保持するテーブルを指定します(この場合、Userテーブルにはprofile_idがあります)。 – Lunfel

関連する問題