この記事では、Eloquent の最も複雑で理解しにくい部分を一緒に学びます - —モデル間の関係。英語の公式ドキュメントではRelationshipsと呼ばれていますが、個人的には現在の「関連付け」よりも「モデル間の関係」と訳した方がわかりやすいと思います(笑)。
Eloquent は ORM であり、正式名は Object Relational Mapping で、「オブジェクト リレーショナル マッピング」と訳されます (データベース抽象化レイヤーの配列ライブラリの抽象化とだけ考える場合)レイヤー、小さすぎるでしょう、見てください)。いわゆる「オブジェクト」は、この記事で「モデル」と呼ばれるものであり、オブジェクト関係マッピングはモデル間の関係です。中国語のドキュメント: http://laravel-china.org/docs/eloquent#relationships
一つずつ学習していきましょう。
名前が示すように、これは 2 つのモデル間の 1 対 1 の関係を記述します。この種のリレーションシップには中間テーブルは必要ありません。
ユーザーとアカウントという 2 つのモデルがあり、それぞれ登録ユーザーと消費者に対応しており、これらは によって提供される 1 対 1 の関係メソッドを使用したいとします。雄弁に、テーブル構造は次のようになります。
user: id ... ... account_id account: id ... ... user_id
User モデル内の対応する Account テーブル情報をクエリする必要があると仮定すると、コードは次のようになります。 `/app/models/User.php`:
<?php class User extends Eloquent { protected $table = 'users'; public function hasOneAccount() { return $this->hasOne('Account', 'user_id', 'id'); } }
では、この関係を使用する必要がある場合、どのように使用すればよいでしょうか?
$account = User::find(10)->hasOneAccount;
このとき取得した`$account`は`Account`クラスのインスタンスです。
ここで最も難しい部分は、次の 2 つの外部キーとローカルキーの設定です。これを覚えておいてください。User クラスでは、誰が持っているかに関係なく、2 番目のパラメータは `user_id` であり、3 番目のパラメータはパラメータは通常 `id` です。前の `find(10)` は id = 10 をロックしているため、この関数に対応する SQL は次のようになります: `select * from account where user_id=10`。
このコードでは、1 対 1 の関係の使用方法を示すことに加えて、Eloquent を使用する際の私からの提案でもある 3 つの情報も伝えています。
1.テーブル名は
2 で指定されます。モデル間の関係は毎回、単に `account()`
ではなく `hasOneAccount()` として記述されます。 used すべてのパラメータを記述します。省略しないでください。
同様に、belongsTo() 関係を使用する場合は、次のように記述する必要があります:
<?php class Account extends Eloquent { protected $table = 'accounts'; public function belongsToUser() { return $this->belongsTo('User', 'user_id', 'id'); } }
学習 1 対 1 の関係を使用する前述の基本的な方法の後、次の関係ははるかに単純になります。
新しいモデルである支払い、支払い記録を導入します。テーブル構造は次のようになります。
user: id ... ... pay: id ... ... user_id
User と Pay は 1 対多の関係になります。つまり、User は複数の Pay を持つことができます。この場合、存在する `user_id` は 1 つだけです。支払いテーブルフィールド。 `/app/models/User.php`:
<?php class User extends Eloquent { protected $table = 'users'; public function hasManyPays() { return $this->hasMany('Pay', 'user_id', 'id'); } }
では、この関係を使用する必要がある場合、どのように使用すればよいでしょうか?
$accounts = User::find(10)->hasManyPays()->get();
このとき取得した`$accounts`は`IlluminateDatabaseEloquentCollection`クラスのインスタンスです。これが単純な `-> hasOneAccount` ではなく、 `->hasManyPays()->get()` であることに誰もが気づいたはずです。なぜなら、ここにはオブジェクトのコレクションを操作する `hasMany` があるからです。
対応するbelongsTo() の使用法は、上記の 1 対 1 の関係と同じです。
<?php class Pay extends Eloquent { protected $table = 'pays'; public function belongsToUser() { return $this->belongsTo('User', 'user_id', 'id'); } }
多対-many 関係は前の関係とはまったく異なります。同様に、多対多の関係には冗長なデータが多数存在する可能性があるため、以前の組み込みテーブルを使用してデータを保存することはできません。
記事とタグという 2 つのモデルを定義します。これらはそれぞれ記事とタグを表します。これらは多対多の関係を持ちます。テーブル構造は次のようになります:
article: id ... ... tag: id ... ... article_tag: article_id tag_id
モデルで使用:
<?php class Tag extends Eloquent { protected $table = 'tags'; public function belongsToManyArticle() { return $this->belongsToMany('Article', 'article_tag', 'tag_id', 'article_id'); } }
3 番目のパラメーターはこのクラスの ID であり、4 番目のパラメーターは最初のパラメータはそのクラスの ID です。
hasMany と同じものを使用します。
$tagsWithArticles = Tag::take(10)->get()->belongsToManyArticle()->get();
ここでは非常に複雑なオブジェクトが得られます。自分で `var_dump()` することができます。トリックを教えてください。「var_dump()」の後に、Chrome で「ソース コードの表示」を右クリックすると、非常にきれいなオブジェクト/配列が展開されているのがわかります。
ここで、まれな使用法 (奇妙でずるい) を紹介します。
public function parent_video() { return $this->belongsToMany($this, 'video_hierarchy', 'video_id', 'video_parent_id'); } public function children_video() { return $this->belongsToMany($this, 'video_hierarchy', 'video_parent_id', 'video_id'); }
はい、正しく読んでいます。あなた自身が ToMany に属することができます。
Eloquent は、「リモート 1 対多関連付け」、「ポリモーフィック関連付け」、「ポリモーフィック多対多関連付け」という 3 つの他の使用法も提供します。上記の学習により、Eloquent モデル間の関係の基本的な概念と使用方法を習得しました。残りの一般的に使用される方法は、使用するときに自分で検討する必要があります。
お気づきかもしれませんが、1 対 1 の関係では、一度に 10 人のユーザーにクエリを実行し、対応するアカウントを取得する必要がある場合、次のことが必要になります。 1 + 10 個の SQL ステートメントをデータベースに書き込むと、パフォーマンスが低下します。重要な機能であるリレーションシップのプリロードを使用できます: http://laravel-china.org/docs/eloquent#eager-loading
コードに直接移動します:
$users = User::with('hasOneAccount')->take(10)->get()
这样生成的 SQL 就是这个样子的:
select * from account where id in (1, 2, 3, ... ...)
这样 1 + 10 条 SQL 就变成了 1 + 1 条,性能大增。
至此,深入理解 Laravel Eloquent 系列文章到此结束。推荐继续了解 软删除 、转换成数组/JSON。