Laravel: передача дополнительного параметра при фильтрации коллекции

#php #laravel #eloquent

#php #laravel #красноречивый

Вопрос:

идея довольно проста, однако я пока не смог ее реализовать.

Вот код

(Я изменил имя переменных, чтобы описать их использование)

     $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;
        }   
    });
  

При выполнении кода я получаю сообщение об ошибке

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

Я проверил, что переменная $games_already_added определена во внешней области видимости и содержит элементы.

Есть ли какой-либо способ, которым я мог бы передать $games_already_added переменную в качестве параметра в функции фильтра коллекции?

Любые предложения или рекомендации высоко ценятся!

Спасибо!

Комментарии:

1. Или вы можете просто сделать return !in_array($game->id,$games_already_added)

2. @djay действительно, djay , но моя проблема здесь заключалась в невозможности доступа к массиву games_already_added , однако, спасибо за более короткую строку!

Ответ №1:

Это не глобальное, но use это работает с закрытием:

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

Комментарии:

1. Еще раз спасибо @deczo! Это обязательно пригодится!

2. Grrr Я знал, что мне нужно use , но забыл заключить аргументы в круглые скобки

Ответ №2:

Это не совсем то, что вы пытаетесь сделать, но похоже, что это то, чего вы хотите достичь.

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

Но если вы действительно хотите выполнить фильтрацию, ответ @deczo — это правильный путь.