/ / Eloquente Verschachtelung mit Klausel in der mittleren Relation - Laravel, eloquent, verschachtelt

Eloquente Verschachtelung mit Klausel in der mittleren Relation - Laravel, eloquent, verschachtelt

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 № 1

Sie 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();