簡體   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