Ich kämpfe um eifrig laden in Laravel arbeiten bei der Arbeit mit einem Drei-Wege-Pivot-Tisch. Die Datenbank wird wie folgt festgelegt:Eager laden Dreiweg Pivot-Tisch Laravel
+-------+--------+-------+-------------+
| deals | venues | users | redeems |
+-------+--------+-------+-------------+
| id | id | id | deal_id |
| title | name | name | user_id |
| | | | venue_id |
| | | | redeemed_at |
+-------+--------+-------+-------------+
Wo redeems
ist offensichtlich die Pivot-Tabelle. Das Benutzermodell sieht wie folgt aus:
<?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']);
}
}
Dies ermöglicht es mir, dies zu tun:
$users = Users::with('deals')->all();
Und dann bekomme ich einen schönen Überblick über den Benutzer und alle Angebote, die sie in eine Struktur eingelöst haben, wie dies:
{
"id": 1,
"name": "Diederik",
"deals": [
{
"id": 33,
"title": "Deal Title",
"pivot": {
"user_id": 1,
"deal_id": 33,
"venue_id": 50
}
}
]
}
Nun möchte Ich mag den Ort Informationen von eifrigen Laden hinzuzufügen, es statt der $user->pivot->venue_id
danach abfragt.
Ich habe versucht, eine belongsTo
Beziehung im deal
Modell einrichten und dann mit einer verschachtelten tun wie so: $users = Users::with('deals.venue')->all();
aber das funktioniert nicht, weil der Deal Tabelle keinen Fremdschlüssel zu einem Ort haben. Dies liegt daran, dass ein Deal für mehrere Veranstaltungsorte angewendet werden kann.
Ich bin mir bewusst, dass dies sehr einfach mit normalen Datenbankabfragen erreichbar ist, aber für die Art, wie unsere API funktioniert, ist es wichtig, die beredte with
Relation Funktion zu verwenden, da unsere URL-Setup sucht nach Includes auf diese Weise.
TLDR: Wie man eifrig verschachtelte Drei-Wege-Pivot-Tabellenrelationen lädt.
Vielen Dank für Ihre Antwort. Die Beziehung zwischen "Deals" und "Venues" ist "Viele-zu-Viele". Ein Deal kann an mehreren Orten eingelöst werden und Veranstaltungsorte können mehrere verschiedene Angebote anbieten. Daher wird das, was Sie vorschlagen, nicht funktionieren, weil es eine andere Pivot-Tabelle ('deals_venue') gibt, die diese beiden verbindet. – Diederik
Lassen Sie mich umformulieren: Was Sie vorschlagen, funktioniert, aber dann werde ich alle Veranstaltungsorte erhalten, die diesen Deal anbieten, nicht den bestimmten Ort, an dem der Deal eingelöst wird. Die Beziehung zwischen den Spielstätten und den Abschlüssen spielt für meine Frage keine Rolle, weshalb ich sie von meiner ursprünglichen Frage ausgelassen habe. – Diederik