Laravel по-русски

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

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

#1 07.01.2017 09:25:14

Вопросы новичка

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

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

Не в сети

#2 07.01.2017 10:17:34

Re: Вопросы новичка

Что именно в работе замыкания не понятно? $query это текущий запрос.

Изменено AlexeyMezenin (07.01.2017 12:19:29)

Не в сети

#3 07.01.2017 10:37:42

Re: Вопросы новичка

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

Не в сети

#4 07.01.2017 12:26:29

Re: Вопросы новичка

Когда if не срабатывает where('group_id', $group_id) просто не добавляется к запросу (нет $query->), т.е. в итоге выполняется:

Contact::orderBy('id', 'desc')->paginate(5);

Изменено AlexeyMezenin (07.01.2017 12:27:25)

Не в сети

#5 07.01.2017 13:28:09

Re: Вопросы новичка

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

Изменено JohnDorian (07.01.2017 13:30:22)

Не в сети

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