Laravel по-русски

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

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

#1 29.06.2020 00:06:06

престлавутый JOIN

    if ($request->input('tags')) {
            $tags = explode(",", (string)$request->input('tags'));
            $query->join('post_tags as pt', function ($join) use ($tags) {
                $join->on('p.id', '=', 'pt.post_id', 'left outer');
                foreach ($tags as $tag) {
                    $join->where('pt.slug', '=', $tag);
                }
            });
        } else {
            $query->join('post_tags as pt', 'p.id', '=', 'pt.post_id', 'left outer');
        }

суть примерно следующая хочу вырать все посты у которых есть все теги из `tags`
один тег выбирает но когда 2 выводит 0
так же было бы интересно если ты я сделал minus_tags  т.е. посты у которых нет любого из minus_tags

Не в сети

#2 01.07.2020 00:46:30

Re: престлавутый JOIN

$tags = explode(",", (string)$request->input('tags'));
$query->join('post_tags as pt', 'p.id', '=', 'pt.post_id')
->whereIn('pt.slug', $tags);

Не в сети

#3 01.07.2020 10:59:14

Re: престлавутый JOIN

Поддерживаю nailfor, но...

Сначала надо выяснить в каком виде ты получаешь tags когда их несколько. Список через запятую можно разобрать через explode(). Но если в параметре tags уже массив, то будет ошибка. Тип зависит от фронта, мы его здесь не видим. Сделай временно вывод диагностики:

dd(request->input('tags'));

Если в выводе увидишь массив, то надо будет строку с explode переделать на

$tags = (array) request->input('tags')

И дальше можно так:

$query->join('post_tags as pt', 'p.id', '=', 'pt.post_id')
->when($tags, function ($query) use ($tags) {
    $query->whereIn('pt.slug', $tags);
});

There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

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