Laravel получает сообщения, по крайней мере, один тег на каждую категорию тегов - PullRequest
0 голосов
/ 31 октября 2019

Я хочу перечислить все записи, по крайней мере, по одному тегу в каждой выбранной категории. В нашем приложении laravel у нас есть модель Post and Tag.

В модели Post у нас есть:

public function tags()
{
    return $this->belongsToMany(Tag::class, 'post_tags', 'post_id', 'tag_id');
}

Что такое запрос для выбора записи, по крайней мере, один из {3,2} тегов ипо крайней мере один из {8,10}?

Я пишу этот код:

$tags = ['news' => [3,2], 'alert' => [8,10]];

Post::whereHas('tags', function($query) use ($tags){
   foreach($tags as $category => $tag){
      $query->whereIn('tags.id', $tag);
   }
}

сообщений

+---------+---------------+
|    id   |     title     |
+---------+---------------+
|    1    |   post 1...   |
|    2    |   post 2...   |
|    3    |   post 3...   |
|    4    |   post 4...   |
|    5    |   post 5...   |
|    6    |   post 6...   |
|    7    |   post 7...   |
|    8    |   post 8...   |
|    9    |   post 9...   |
+---------+---------------+

тегов

+---------+-------+------------+
|    id   |  name |  category  |
+---------+-------+------------+
|    1    | stock |   news     |
|    2    |  acc  |   news     |
|    3    |  etc  |   news     |
|    4    |  eco  |   news     |
|    5    |  side |   ads      |
|    6    |  head |   ads      |
|    7    | footer|   ads      |
|    8    |  info |   alert    |
|    9    | danger|   alert    |
|   10    |success|   alert    |
+---------+-------+------------+

post_tags

+-----------+---------+
|  post_is  | tag_id  |
+-----------+---------+
|     1     |    3    |
|     1     |    4    |
|     1     |    5    |
|     1     |    8    |
|     1     |    9    |
|     1     |   10    |
|     9     |    9    |
|     9     |    6    |
|     3     |    7    |
|     7     |    1    |
|     7     |    2    |
|     7     |    8    |
+-----------+---------+

Но результат - ничто.

Мне нужен результат, так как Post Eloquent и производительность запросов важны.

Версия larave - 5.8.35

1 Ответ

2 голосов
/ 31 октября 2019

Я бы начал здесь с необработанного MySQL-запроса, который выполняет свою работу. Затем создайте свой сценарий Laravel вокруг этого.

SELECT
    p.id,
    p.title
FROM posts p
INNER JOIN post_tags pt
    ON pt.post_id = p.id
GROUP BY
    p.id,
    p.title
HAVING
    SUM(pt.tag_id IN (2, 3)) > 0 AND
    SUM(pt.tag_id IN (8, 10)) > 0;

Ваш код Laravel:

$posts = DB::table('posts p')
    ->join('post_tags pt', 'pt.post_id', '=', 'p.id')
    ->groupBy('p.id', 'p.name')
    ->havingRaw('SUM(pt.tag_id IN (2, 3)) > 0 AND SUM(pt.tag_id IN (8, 10)) > 0')
    ->select('p.id', 'p.name')
    ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...