Eloquent とは何ですか?
Eloquent は Object Relational Mapping の略で、「オブジェクト リレーショナル マッピング」と訳される ORM です (データベース抽象化層の配列ライブラリの抽象化層とだけ考えると過小評価されすぎます)。 。いわゆる「オブジェクト」は、この記事で「モデル」と呼ばれるものであり、オブジェクト関係マッピングはモデル間の関係です。中国語のドキュメント: http://laravel-china.org/docs/eloquent#relationships
一つずつ学習していきましょう。
1 対 1 の関係
その名前が示すように、これは 2 つのモデル間の 1 対 1 の関係を表します。この種のリレーションシップには中間テーブルは必要ありません。
ユーザーとアカウントという 2 つのモデルがあるとします。これらはそれぞれ登録ユーザーと消費者に対応しており、Eloquent が提供する 1 対 1 の関係メソッドを使用したい場合は、テーブル構造は次のようになります:
user: id ... ... account_id
account: id ... ... user_id
User モデル内の対応する Account テーブル情報をクエリする必要があるとします。コードは次のようになるはずです。 `/app/models/User.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 リレーションシップの使用方法を示すことに加えて、このコードは 3 つの情報も伝えます。これらは、Eloquent を使用する際の皆さんへの私の提案でもあります:
1. 各モデルでテーブル名を指定します
2 . には 1 つのアカウントがあります このような関係は、単に `account()` ではなく `hasOneAccount()` として記述されます
3. モデル間の関係を使用するたびに、すべてのパラメーターを省略しないでください
同様に、belongsTo を使用する場合は、 ( ) 関係は次のように記述する必要があります:
class Account extends Eloquent {
protected $table = 'accounts';
public functionelvesToUser()
{
return $this- >belongsTo('User', 'user_id', 'id');
}
}
1 対多の関係
1 対 1 の関係の基本的な使用方法を学習した後、次の関係を構築します。はるかに簡単になります。
新しいモデルである支払い、支払い記録を導入します。テーブル構造は次のようになります:
user: id ... ...
pay: id ... ... user_id
User と Pay は 1 対多の関係になります。ユーザーは多くの Pay を持つことができますが、この場合、Pay テーブルには `user_id` フィールドが 1 つだけあります。 `/app/models/User.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の関係と同じです:
class Pay extends Eloquent {
protected $table = 'pays';
public function belongsToUser()
{
return $this->belongsTo('User', 'user_id', 'id');
}
}
多対多の関係
多対多これは、多対多のリレーションシップには、組み込みテーブルを使用して保存できない冗長データが大量に存在する可能性があるためです。
記事とタグという 2 つのモデルを定義します。これらはそれぞれ記事とタグを表します。これらは多対多の関係を持ちます。テーブル構造は次のようになります:
article: id ... ...
tag: id ... ...
article_tag:article_id tag_id
モデルで使用:
class タグは Eloquent を拡張します {
protected $table = 'tags';
public function believeToManyArticle()
{
return $this->belongsToMany( ' Article', 'article_tag', 'tag_id', 'article_id');
}
}
3 番目のパラメータはこのクラスの ID であり、4 番目のパラメータは最初のパラメータであることに注意してください。クラスの。
hasMany と同じものを使用します:
$tagsWithArticles = Tag::take(10)->get()->belongsToManyArticle()->get();
ここでは非常に複雑なオブジェクトを取得します。自分で実行できます `var_dump()`。トリックを教えてください。「var_dump()」の後に、Chrome で「ソース コードの表示」を右クリックすると、非常にきれいなオブジェクト/配列が展開されているのがわかります。一 ここで珍しい使い方を紹介します (奇巧
):
Public Function Parent_video () {
Return $ This- & GT; ($ this, 'video_hierarchy', 'video_id', 'Video_parent_id ') ;
}
public function Children_video()
{
} return $this->belongsToMany($this, 'video_hierarchy', 'video_parent_id', 'video_id'); はい、あなたはそのとおりです。あなた自身が多くのものに属することができます。