Laravel по-русски

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

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

#1 11.02.2017 17:31:37

Фильтрация по отношениям

Доброго времени суток уважаемые!

Пишу фильтр по нескольким критериям.

//заводим пустой запрос
$query = Profile::query();

//наполняем его по мере необходимости
if ($request->input('pack') && $request->input('pack') != 0) {
            $query = $query->where('company_pack', '=', $request->input('pack'));
}
        
if ($request->input('qualification') && $request->input('qualification') != 0) {
            $query = $query->where('company_status', '=', $request->input('qualification'));
}

//вот тут у меня проблема...
//Имя Фамилия искомого вводятся через одно поле (один тег)

        if($request->input('name') !== Null){
         //если вообще хоть что-то введено
            $user_name = explode(' ',$request->input('name'));
            //разбиваем полученную строку на элементы
            if(count($user_name) > 0){
               //имеется хотя бы 1 элемент (Имя)
               //echo 'user name '.$user_name[0].' filter<br/>';

                $name = $user_name[0];
                //а вот эта фильтрация по отношению НЕ РАБОТАЕТ
                $query = $query->with(['user' => function($query) use ($name)
                {
                    $query->where('name', 'like', '%'.$name.'%');
                }]);
                
                if(count($user_name) > 1){
                    ... имеется еще и фамилия....
                }
            }
        }
        
        $data = $query->get();

Интересно, что реализация через Join работает прекрасно, но в этом случае недоступна пагинация... которая нужна.

Не в сети

#2 11.02.2017 19:03:08

Re: Фильтрация по отношениям

$data = $query->toSql();
var_dump($data);

выдает:
string(132) "select * from `profiles` inner join `users` on `users`.`id` = `profiles`.`user_id` and `users`.`name` like ? where `sponsors` like ?"

Вместо значений переменных стоят знаки вопроса (?)

$data = $query->getBindings();
var_dump($data);

returned array(2) { [0]=> string(7) "%Vanya%" [1]=> string(4) "%19%" }

Изменено Dzhangar (11.02.2017 19:10:46)

Не в сети

#3 11.02.2017 19:24:39

Re: Фильтрация по отношениям

$name = $user_name[0];
$query = $query->with(['user' => function($q) use ($name){
                    $q->where('name', 'like', '%'.$name.'%');
                }]);

просто добавляет к выходному массиву данных таблицу Users (соотвественно указанному отношению), но предложение where не исполняется....

Не в сети

#4 11.02.2017 20:41:57

Re: Фильтрация по отношениям

фильтрация работает только в виде:

                $name = $user_name[0];
                $query = $query->join('users', function ($join) use ($name) {
                    $join->on('users.id', '=', 'profiles.user_id')
                    ->where('users.name', 'like', '%'.$name.'%');
                });

при этом, производится корректная выборка только для русских (киррилических) имен.
Например, Иван - находится прекрасно, Vanay - возвращает пустой массив... забавно при том, что используется кодировка utf8-general-ci

Не в сети

#5 11.02.2017 20:53:26

Re: Фильтрация по отношениям

кстати, я оказался неправ насчет пагинации.... прекрасно работает при join'e

Не в сети

#6 12.02.2017 06:50:40

Re: Фильтрация по отношениям

потому что джойн выполняется на одну запись. если джойнить по отношениям многие-ко-многим или один-ко-многим (со стороны где один) – limit/offset будет применяться к отдельным рядам, а поскольку на одну запись могут вернуться несколько рядов – сам понимаешь что получится

Не в сети

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