2014-07-06 8 views
14

die Idee, es ist ganz einfach, aber ich konnte es noch nicht materialisieren.Laravel: Passing extra Parameter auf Sammlung Filterung

Hier ist der Code

(ich den Namen der Variablen geändert haben ihre Verwendung zu beschreiben)

$games = Game::all(); 
    $games_already_added = $member->games()->lists('id'); 

    $games = $games->filter(function($game){ 
     global $games_already_added; 
     if(!in_array($game->id,$games_already_added)){ 
      return true; 
     } 
    }); 

Wenn der Code ausgeführt wird, erhalte ich die Fehler

in_array() expects parameter 2 to be array, null given

Ich habe überprüft, dass die Variable $games_already_added auf dem äußeren Bereich definiert ist und Elemente enthält.

Gibt es eine Möglichkeit, die $games_already_added Variable als Parameter für die Filterfunktion der Sammlung übergeben?

Jede Art von Vorschlag oder Anleitung wird sehr geschätzt!

Vielen Dank!

+1

Oder du kannst einfach 'return! In_array ($ game-> id, $ games_already_added)' – Yang

+0

@djay in der Tat djay, aber mein Problem hier war nicht in der Lage, auf die games_already_added Array zugreifen, aber danke für die kürzere Linie! –

Antwort

47

Es ist nicht global, sondern use, die mit einem Verschluss funktioniert:

$games = $games->filter(function($game) use ($games_already_added) { 
    if(!in_array($game->id,$games_already_added)){ 
     return true; 
    } 
}); 
+0

Nochmals vielen Dank @deczo! Das wird sicher nützlich sein! –

+1

Grrr Ich wusste, dass ich "verwenden" brauchte, aber vergessen habe, Argumente in Klammern zu verpacken – wired00

2

Dies ist nicht unbedingt, was Sie zu tun versuchen - aber es sieht aus wie es ist, was Sie erreichen wollen.

$games_already_added = $member->games()->lists('id'); 
$games = Game::whereNotIn('id', $games_already_added)->get(); 

Aber wenn Sie wirklich die Filterung machen wollen, ist @ Deczos Antwort der richtige Weg.