@verygoodboy

Как при помощи group_concat получить данные из связанной таблицы?

Всем привет. Подскажите как правильно построить запрос. Я использую laravel query builder.

Есть 3 таблицы:
- posts - таблица постов. Поля: id, title, content.
- tags - таблица тегов. Поля: id, name.
- post_tag - связующая таблица. Поля: id, post_id, tag_id.

Отношения многие ко многим, posts принадлежат к tags.

Вот так выглядит таблица на сайте:
6374020d66d61095959395.png

Задача такая, необходимо получить все posts и в подзапросе получить связанные с ними tags (поля name через запятую).

В результате должен получится массив из постов и у каждого поста должен быть ключ, например, tags_names со значением равным строке из имен тегов, к которым относится этот пост с разделителем через запятую.

Вот тот код, над которым я ломаю голову:
$tagSub = DB::table('tags')
            ->selectRaw('group_concat(name) as tags_names');

$posts = Post::where('status', 1)
            ->with('tags')
            ->leftJoinSub($tagSub, 'tag_sub', function ($q) {
                $q->on('posts.id', '=', 'tags.id');
            })
            ->select('posts.*',
                'tag_sub.name as post_tags_names')
            ->paginate();


Я не могу понять как использовать в этом запросе связующую табличку...
  • Вопрос задан
  • 107 просмотров
Решения вопроса 1
iMedved2009
@iMedved2009
Не люблю людей
Post::where('status', 1)
    ->join('post_tag', 'posts.id', '=', 'post_tag.post_id')
    ->join('tags', 'tags.id', '=', 'post_tag.tag_id')
    ->select('posts.*', DB::raw('group_concat(tags.name) as tags_name'))
    ->groupBy('posts.id', 'posts.name', 'posts.content')->get();


как вариант
Post::where('status', 1)
    ->select('posts.*', DB::raw('select group_concat(tags.name) as tags_name from post_tag join tags on tags.id=post_tag.tag_id where post_tag.post_id = posts.id'))->get();
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы