繁体   English   中英

Laravel 获取帖子在每个标签类别上至少有一个标签

[英]Laravel get posts have atleast one tag on each category of tags

我想列出所有帖子在我选择的每个类别上至少有一个标签。 在我们的 laravel 应用程序中,我们有一个帖子和标签 model。

在 model 后,我们有:

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

对 select 帖子的查询有至少一个 {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    |
+-----------+---------+

但结果什么都没有。

我需要 Eloquent 后的结果,查询性能很重要。

larave 版本是 5.8.35

我将从一个原始的 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();

我认为您忘记编写get()方法并且还缺少右括号。

尝试以下查询:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM