Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Всем привет. Подскажите пожалуйста, есть простенький код -
if ($group_id = ($request->get('group_id'))) {
$contacts = Contact::where('group_id', $group_id)->orderBy('id', 'desc')->paginate(5);
} else {
$contacts = Contact::orderBy('id', 'desc')->paginate(5);
}
Ничего сверхъестественного, в зависимости от гет параметра меняем запрос. Теперь этот же код, только немного в другой форме -
$contacts = Contact::where(function ($query) use ($request) {
if ($group_id = ($request->get('group_id'))) {
$query->where('group_id', $group_id);
}
})
->orderBy('id', 'desc')
->paginate(5);
И вот тут я уже всю голову сломал. Как работает замыкание в этом примере? Что прилетает в переменную $query? Почему если if не срабатывает, код все равно работает и идет запрос типа orderBy('id', 'desc') вместо where. Буду сильно благодарен объяснению
Не в сети
С if у меня все правильно, в зависимости от того, существует ли group_id, выполняется нужный запрос. А по поводу замыкания, в первом примере кода, при попадании в if , выполняется блок с Contact::where, и соответственно выполняется запрос -
select * from `contacts` where (`group_id` = '1') order by `id` desc limit 5 offset 0
если нет, выполняется Contact::orderBy -
select * from `contacts` order by `id` desc limit 5 offset 0
Теперь берем пример с замыканием, если попадаем в if, идет запрос -
select * from `contacts` where (`group_id` = '1') order by `id` desc limit 5 offset 0
Никаких else тут нету, но при этом, если в if не попадаем, идет запрос -
select * from `contacts` order by `id` desc limit 5 offset 0
То есть отрабатывает по сути Contact::orderBy из первого примера, но явно он нигде не указан в замыкании, так откуда тогда он это берет.
Не в сети
Когда if не срабатывает where('group_id', $group_id) просто не добавляется к запросу (нет $query->), т.е. в итоге выполняется:
Contact::orderBy('id', 'desc')->paginate(5);
Изменено AlexeyMezenin (07.01.2017 12:27:25)
Не в сети
Спасибо за помощь. Полазил еще в исходниках, то есть если передаем замыкание, в $query залетает Builder и дальше уже строится запрос. Не до конца конечно понятно как это все работает в ларавеле, но надеюсь когда-нибудь придет понимание
Изменено JohnDorian (07.01.2017 13:30:22)
Не в сети
Страницы 1