Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 Re: Laravel 5.x » Вопросы новичка » 07.01.2017 13:28:09

Спасибо за помощь. Полазил еще в исходниках, то есть если передаем замыкание, в $query залетает Builder и дальше уже строится запрос. Не до конца конечно понятно как это все работает в ларавеле, но надеюсь когда-нибудь придет понимание

#2 Re: Laravel 5.x » Вопросы новичка » 07.01.2017 10:37:42

С 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 из первого примера, но явно он нигде не указан в замыкании, так откуда тогда он это берет.

#3 Laravel 5.x » Вопросы новичка » 07.01.2017 09:25:14

JohnDorian
Ответов: 4

Всем привет. Подскажите пожалуйста, есть простенький код -

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. Буду сильно благодарен объяснению

Подвал раздела