ホームページ  >  記事  >  バックエンド開発  >  3. Laravel Eloquentを深く理解する(3) ~モデル間の関係(関連付け)~

3. Laravel Eloquentを深く理解する(3) ~モデル間の関係(関連付け)~

WBOY
WBOYオリジナル
2016-06-20 12:40:40867ブラウズ

Laravel Eloquent の徹底理解 (3) - モデル間の関係 (関連付け)

この記事では、Eloquent の最も複雑で理解しにくい部分を一緒に学びます - —モデル間の関係。英語の公式ドキュメントではRelationshipsと呼ばれていますが、個人的には現在の「関連付け」よりも「モデル間の関係」と訳した方がわかりやすいと思います(笑)。

Eloquent とは

Eloquent は ORM であり、正式名は Object Relational Mapping で、「オブジェクト リレーショナル マッピング」と訳されます (データベース抽象化レイヤーの配列ライブラリの抽象化とだけ考える場合)レイヤー、小さすぎるでしょう、見てください)。いわゆる「オブジェクト」は、この記事で「モデル」と呼ばれるものであり、オブジェクト関係マッピングはモデル間の関係です。中国語のドキュメント: http://laravel-china.org/docs/eloquent#relationships

一つずつ学習していきましょう。

1 対 1 の関係

名前が示すように、これは 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 対 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。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。