3方向ピボットテーブルを使って作業するとき、Laravelで熱心な読み込みができるように苦労しています。次のようにデータベースが設定されている:redeems
が明らかにピボットテーブルであるEager load three wayピボットテーブルLaravel
+-------+--------+-------+-------------+
| deals | venues | users | redeems |
+-------+--------+-------+-------------+
| id | id | id | deal_id |
| title | name | name | user_id |
| | | | venue_id |
| | | | redeemed_at |
+-------+--------+-------+-------------+
。
<?php
class User extends Authenticatable
{
/**
* The deals redeemed by the user.
*/
public function deals()
{
return $this->belongsToMany(Deal::class, 'redeems')
->withPivot(['venue_id', 'redeemed_at']);
}
}
これは私がこれを行うことができます::
$users = Users::with('deals')->all();
をそして私は、ユーザーの素敵な概要と、彼らはのような構造に償還したすべての取引を取得するユーザモデルは次のようになりますこの:
{
"id": 1,
"name": "Diederik",
"deals": [
{
"id": 33,
"title": "Deal Title",
"pivot": {
"user_id": 1,
"deal_id": 33,
"venue_id": 50
}
}
]
}
今、私はそれをロードする代わりに、その後$user->pivot->venue_id
を照会熱心なことで会場の情報を追加したいと思います。
私はdeal
モデルでbelongsTo
関係を設定して、そのような入れ子になったをやってみました:$users = Users::with('deals.venue')->all();
が、取引テーブルは会場への外部キーを持っていないので、それは動作しません。これは、複数の会場に取引を適用できるためです。
私はこれが通常のデータベースクエリを使用して非常に簡単に達成できることに気付いていますが、私たちのAPIの仕組みについては、曖昧なwith
リレーション機能を使用することが不可欠です。
TLDR:どのようにネストされた3方向ピボットテーブル関係を読み込むか。
ご回答いただきありがとうございます。 「取引」と「会場」の関係は多対多である。複数の会場で取引を交換することができ、会場は複数の異なる取引を提供することができます。したがって、あなたが提案しているものは、それらの2つを結ぶ別のピボットテーブル( 'deals_venue')が存在するため動作しません。 – Diederik
言い換えれば、あなたが提案しているものはうまくいっていますが、その取引を提供するすべての会場を受け取ります。取引が償還される特定の会場ではありません。会場と取引の関係は私の質問にとっては重要ではないので、私は最初の質問からそれを省いたのです。 – Diederik