Ich habe folgende Beziehungen:
- Benutzer [viele-zu-viele mit] Zuweisungen
- Zuweisungen [viele-zu-viele mit] Abzeichen
- Die Pivot-Tabelle "task_user" hat ein Flag "is_finished", das ich wahr sein muss
Das sind meine Beziehungen in den passenden Modellen:
User.php
public function assignments()
{
return $this->belongsToMany("Assignment")->withPivot("is_finished")->withTimestamps();
}
Assignment.php
public function badges()
{
return $this->belongsToMany("Badge", "badge_assignment")->withTimestamps();
}
Badge.php
public function assignments()
{
return $this->belongsToMany("Assignment", "badge_assignment")->withTimestamps();
}
Ich versuche, alle Abzeichen für die abgeschlossenen Aufgaben meines Benutzers zu erhalten. Dies war meine Anfrage:
$user = User::with(array(
"assignments" => function($query) {
$query->where("is_finished", "=", true)->orderBy("updated_at", "desc");
})
)
->with("badges")
->username($name)->first();
Es wird jedoch der Fehler "Aufruf an undefined-Methode IlluminateDatabaseQueryBuilder :: badges ()" gerendert, wenn ich foreach ($ user-> assignments-> badges ...) verwende.
Ich habe dann versucht, Abzeichen im Rahmen des ersten mit zu bekommen, aber ich weiß nicht, wie ich erreichen soll:
$user = User::with(array(
"assignments.badges" => function($query) {
$query->where("is_finished", "=", true)->orderBy("updated_at", "desc");
})
)
->username($name)->first();
Damit bekomme ich "Spalte nicht gefunden", weil die Abfrage nach is_finished innerhalb der Badges sucht, nicht nach der Zuordnung von_signies_user.
Als ich dieses Problem hatte, versuchte ich es nur um sicher zu sein:
User::with("assignments.badges")->whereUsername($username);
... und ich bekomme immer noch "Undefined-Eigenschaft: IlluminateDatabaseEloquentCollection :: $ badges".
Was mache ich falsch?
Antworten:
1 für die Antwort № 1Sie müssen geschachtelt laden assignments.badges
so was:
$user = User::with(array(
"assignments" => function($query) {
$query->where("is_finished", "=", true)->orderBy("updated_at", "desc");
})
)
->with("assignments.badges")
->username($name) // do you have a scope for this or should it be whereUsername?
->first();