Подтвердить что ты не робот

Laravel Advanced Wheres, как передать переменную в функцию?

Пример в документе:

DB::table('users')
        ->whereExists(function($query)
        {
            $query->select(DB::raw(1))
                  ->from('orders')
                  ->whereRaw('orders.user_id = users.id');
        })
        ->get();

Но что, если мне нужно использовать внешнюю переменную вроде этого:

            ->where('city_id', '=', $this->city->id)
            ->where(function($query)
                {
                    $query->where('name', 'LIKE', '%'.$searchQuery.'%')
                    ->orWhere('address', 'LIKE', '%'.$searchQuery.'%')

                })

Теперь я создал новое свойство и получил доступ к нему через $this->, но есть ли более удобный способ?

4b9b3361

Ответ 1

Вы можете передать необходимые переменные из родительской области в замыкание с помощью ключевого слова use.

Например:

DB::table('users')->where(function ($query) use ($activated) {
    $query->where('activated', '=', $activated);
})->get();

Подробнее об этом здесь.

ОБНОВЛЕНИЕ (обновление 2019 г.):

PHP 7.4 (будет выпущен 28 ноября 2019 года) представляет более короткий вариант анонимных функций, называемых arrow functions, что делает его немного менее многословным.

Пример использования PHP 7.4, который функционально почти эквивалентен (см. третий пункт ниже):

DB::table('users')->where(fn($query) => $query->where('activated', '=', $activated))->get();

Отличия от обычного синтаксиса:

  • Ключевое слово fn вместо function.
  • Нет необходимости явно перечислять все переменные, которые должны быть захвачены из родительской области - теперь это выполняется автоматически по значению. См. отсутствие ключевого слова use в последнем примере.
  • Функции стрелок всегда возвращают значение. Это также означает, что при их объявлении невозможно использовать тип возвращаемого значения void.
  • Ключевое слово return должно быть опущено.
  • Функции стрелок должны иметь одно выражение, которое является оператором возврата. Многострочные функции в настоящее время не поддерживаются. Вы все еще можете цепочки методов, хотя.

Ответ 2

Ответ

@kajetons полностью функциональный.

Вы также можете передавать несколько переменных, передавая их следующим образом: use($var1, $var2)

DB::table('users')->where(function ($query) use ($activated,$var2) {
    $query->where('activated', '=', $activated);
    $query->where('var2', '>', $var2);
})->get();

Ответ 3

Если вы используете красноречивый Laravel, вы также можете попробовать это.

$result = self::select('*')
                    ->with('user')
                    ->where('subscriptionPlan', function($query) use($activated){
                        $query->where('activated', '=', $roleId);
                    })
                    ->get();

Ответ 4

Вы можете передавать переменные, используя это...

$status =1;
 $info = JOBS::where(function($query) use ($status){        
         $query->where('status',$status);
         })->get();
print_r($info);