2016-07-09 5 views
0

Ich habe eine URL, die so aussieht: site.com/athletes/1 Jeder Athlet kann viele Positionen haben. Von der oben genannten URL versuche ich, alle Athleten, die zur Positions-ID von 1 gehören, zu bekommen. Meine Beziehung funktioniert großartig, aber ich gebe alle Athleten zurück, ungeachtet des URL-Segments.Laravel: Wie kann ich wo auf einer with-Anweisung verwenden?

Ich habe 3 Tabellen: athletes, positions & athlete_position.

athletes 
    id 
    name 

positions 
    id 
    name 

athlete_position 
    athlete_id 
    position_id 

Athlete.php

public function positions() 
{ 
    return $this->belongsToMany('App\Position', 'athlete_position', 'athlete_id', 'position_id'); 
} 

Position.php

public function athletes() 
{ 
    return $this->belongsToMany('App\Athlete'); 
} 

AthleteController.php

public function position(Position $position) { 
    $athletes = Athlete::with('positions')->get(); 

    dd($athletes); // returns all athletes with the position relationship 
} 

Es ist wie ich so etwas wie dies benötigen:

$athletes = Athlete::with('positions')->where('position_id', '=', $position->id)->get(); 

Aber das ist nicht die Beziehung funktioniert nicht richtig. Gibt es eine Möglichkeit, eine where Klausel in dem Modell zu verwenden? So, wenn ich die URL site.com/athletes/2 besuche, bekomme ich nur die Athleten zurück, die zur Positionsidentifikation von 2 gehören?

Vielen Dank für Anregungen!

EDIT

Alles funktioniert super! Vielen Dank @Lagbox! Es stellte sich wieder heraus, dass ich über alles nachdachte.

Nur eine kurze Follow-up-Frage. Was ist der beste Weg, wenn ein Athlet zu Position 1 gehört und Position 2?

Wenn ich die Athleten aus meiner Sicht durchlaufe, sollte ich einfach die Positions-ID gegen das URL-Segment prüfen, um nur die spezifische Position anzuzeigen?

Etwas wie:

@foreach($athletes as $athlete) 
    @foreach($athlete->positions as $position) 
     @if($position->id == {{ Request::segment(3) }} 
      // Show the athlete 
     @endif 
    @endforeach 
@endforeach 

Ansonsten, da der Athlet angehört wird in den Ergebnissen zeigen sich zweimal id 1 und 2, dass Sportler zu positionieren. Ich möchte nur, dass der Athlet einmal auftaucht - für die gewünschte Position.

Zum Beispiel: site.com/athletes/position/1

Dies ist, was ich jetzt sehe.

Athlete 
    name: Foo 
    position_id: 1 

Athlete 
    name: Foo 
    position_id: 2 

Athlete 
    name: Bar 
    position_id: 1 

Athlete 
    name: Bar 
    position_id: 2 

Aus der gleichen URL oben, ist es das, was ich möchte zurück bekommen:

Athlete 
    name: Foo 
    position_id: 1 

Athlete 
    name: Bar 
    position_id: 1 

Antwort

2

Sie whereHas verwenden können, um die Existenz einer Beziehung auf Bedingungen beruhen zu überprüfen.

Obwohl es scheint, als ob Sie in der Lage sein sollten, nur die Instanz des Positionsmodells zu verwenden, die Sie dafür haben, da Sie bereits die umgekehrte Beziehungseinstellung haben.

$athletes = $position->athletes; 
// or to also have all those athletes positions 
$athletes = $position->athletes()->with('positions')->get(); // egaer loading 
// or if you have `athletes` loaded already 
$athletes = $position->athletes->load('positions'); // with lazy eager laoding 

Ich habe einen Artikel kleine Eloquent Beziehungen, die asklagbox - blog - Eloquent Relations Beziehungen zur Abfrage über einige Wege geht

Aktualisiert Frage: Sie wahrscheinlich an allen Positionen der Athleten nicht brauchen, da Sie wissen alle Athleten, die Sie derzeit in dieser Sammlung haben, haben alle diese besondere. Wenn das der Fall ist, können Sie einfach die $position an die Ansicht zurückgeben.

return view(..., ['position' => $position]); 

Athletes for Position: {{ $position->name }} 
<ul> 
@foreach ($position->athletes as $athlete) 
    <li>{{ $athlete->name }}</li> 
@endforeach 
</ul> 
+0

Das ist absolut fantastisch. Vielen Dank für Ihre Antwort. Dein Blogpost ist super! Alles funktioniert super - ich habe nur eine Nachfolgefrage. Ich habe meine Frage aktualisiert. – Damon

+0

AAAHHH! Ich bekomme Tunnelblick auf den Athleten und verliere die Tatsache, dass ich die Inverse nutzen und die Position nutzen kann, um auch die Athleten zu bekommen. Vielen Dank für Ihre Zeit! – Damon