Laravel Advanced Wheres як передати змінну у функцію?


86

Приклад у документі:

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->, але чи є якийсь зручніший спосіб?

Відповіді:


225

Ви можете передати необхідні змінні з батьківської області в закриття з useключовим словом.

Наприклад:

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

Детальніше про це тут .

EDIT (оновлення 2019 р.):

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

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

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

Відмінності порівняно зі звичайним синтаксисом:

  • fnключове слово замість function.
  • Не потрібно явно перераховувати всі змінні, які слід захопити з батьківської області - тепер це робиться автоматично за значенням. Дивіться відсутність useключового слова в останньому прикладі.
  • Функції зі стрілками завжди повертають значення. Це також означає, що неможливо використовувати voidтип return при їх оголошенні.
  • returnКлючове слово повинно бути опущено.
  • Функції стрілок повинні мати єдиний вираз, який є оператором return. На даний момент багаторядкові функції не підтримуються. Ви все ще можете ланцюгові методи.

15

Відповідь @kajetons повністю функціональна.

Ви також можете передавати кілька змінних, передаючи їх, як: use($var1, $var2)

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

5

Якщо ви використовуєте красномовний продукт Laravel, ви можете спробувати і це.

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

2

Ви можете передавати змінні за допомогою цього ...

$status =1;
 $info = JOBS::where(function($query) use ($status){        
         $query->where('status',$status);
         })->get();
print_r($info);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.