Запуск Query Builder без использования запроса

Итак, я могу использовать User::where('username', '!=', null)->get();

Однако я нахожусь в том случае, когда хочу цеплять запросы, используя условия if, начиная с первого, и в этом случае where('username', '!=', null) не нужен. Приведу псевдопример:

Я запускаю отчет на основе пользователей, где есть несколько полей. Я хочу инициализировать построитель запросов таким образом и создавать цепочки запросов, используя операторы if.

$user = User::class();   // I know I can't use this line, however you'll get the idea.

if (isset($gender)) {
   $user = $user->where('gender', $gender);
}

if (isset($age)) {
   $user = $user->where('age', $age);
}

$users = $user->get()

Единственный способ начать запрос (в первой строке) с:

$user = User::where('username', '!=', null)

person senty    schedule 18.07.2018    source источник


Ответы (2)


Вы можете создать экземпляр своего объекта, например:

$user = (new User);

ПРИМЕЧАНИЕ. Однако лучше использовать when() вместо операторов if.

$users = User::when($gender, function ($query, $gender) {
    $query->where('gender', $gender);
})
->when($age, function ($query, $age) {
    $query->where('age', $age);
})
->get();

Если переменные не инициализированы, вы можете использовать метод isset(), например:

$users = User::when( isset($gender), function ($query, $gender) {
    $query->where('gender', $gender);
})
->when( isset($age), function ($query, $age) {
    $query->where('age', $age);
})
->get();
person Zakaria Acharki    schedule 18.07.2018
comment
when совсем новый, верно? Не могли бы вы привести псевдо пример? - person senty; 18.07.2018
comment
Вам понадобится isset в when. Значит будет when(isset($gender), ...) - person Chin Leung; 18.07.2018
comment
Обновил заодно, в любом случае спасибо за вмешательство. - person Zakaria Acharki; 18.07.2018
comment
Я добавил пример @senty - person Zakaria Acharki; 18.07.2018
comment
Ты не собираешься использовать when @senty? - person Zakaria Acharki; 18.07.2018
comment
Я не могу использовать его, потому что мне нужно сначала проверить isset() регистр. Но спасибо за подсказку! Ах, только что увидел комментарий isset. - person senty; 18.07.2018
comment
Рад, что смог помочь брату. Но я уже добавил проверку isset в when - person Zakaria Acharki; 18.07.2018
comment
Я сомневаюсь, что вам нужно isset(). Если вы хотите получить ввод запроса безопасным способом, используйте, например, $request->input('field') или $request->get('field'). Он вернет значение по умолчанию, которое вы можете указать в качестве второго параметра, которое по умолчанию равно null. - person Namoshek; 18.07.2018
comment
@ZakariaAcharki Ваше изменение с помощью isset приведет к неправильным результатам. Теперь $gender в функции обратного вызова будет true или false. Теперь вам придется использовать use ($gender) для обратного вызова, но это грязно... - person Namoshek; 18.07.2018
comment
Это зависит от версии, я думаю, @Namoshek, поскольку isset уже протестирован в 5.5 и 5.6, и он работает нормально ... И вы правы, если пол и возраст получены из запроса, будет лучше использовать $request->get('field') @сенти. - person Zakaria Acharki; 18.07.2018
comment
Не должно зависеть от версии. when($value, $callback) передает $value в $callback в качестве второго параметра. Поэтому, если вы используете isset($something), это может быть только true или false. git blame говорит, что так было с 5.4. - person Namoshek; 18.07.2018

Ты ищешь

$userQuery = User::query();

Затем добавьте несколько дополнительных пунктов:

$userQuery->where(...);

Затем укажите closure (->first(), ->get() и т. д.), чтобы ваши пользователи:

$users = $userQuery->get();
person Tim Lewis    schedule 18.07.2018
comment
Большое спасибо! Это был ответ на ОП, однако другой ответ тоже довольно аккуратный способ сделать это. - person senty; 18.07.2018
comment
Без проблем. Подход ->when() здесь имеет смысл; возможно, придется начать использовать этот метод самостоятельно. Ваше здоровье! - person Tim Lewis; 18.07.2018