首页 > 解决方案 > 获取列值不超过 7 的标签的帖子

问题描述

说,我有两个多对多关系的实体:

posts

-id
-title    
-body

tags

-id  
-title
-sequence (int)

post_tag

-post_id
-tag_id

我想抓住那些标签的最后一个sequence值为7. 忍受我。一个例子会更有意义:

post_tag:
=========
-post_id: 1
-tag_id: 3

-post_id: 1
-tag_id: 4
tags:
=====
-id: 3
-sequence: 2

-id: 4
-sequence: 7

 Post ID 1 should be returned

post_tag:
=========
-post_id: 2
-tag_id: 4

-post_id: 2
-tag_id: 5
tags:
=====
-id: 4
-sequence: 7

-id: 5
-sequence: 8

Post ID 2 should NOT be returned because it has a tag whose sequence exceeds 7.

post_tag:
=========
-post_id: 3
-tag_id: 2

-post_id: 3
-tag_id: 3

-post_id: 3
-tag_id: 4
tags:
=====
-id: 2
-sequence: 1

-id: 3
-sequence: 2

-id: 4
-sequence: 7

 Post ID 3 should be returned

这是我到目前为止所尝试的:

$posts = Post::whereHas('tags', function($q){ $q->where('sequence', 7);})->get();

但它甚至会返回那些序列高于 7 的帖子。我没有抱怨。我知道为什么它返回标签序列大于 7 的帖子。我只是不知道如何解决这个问题。

提示:在查询方面,问题可以被认为是:

不超过 X 和 X(包括 X 和 X)

标签: laraveleloquent

解决方案


可能你正在寻找的是whereDoesntHave()

$posts = Post::whereHas('tags', function ($q) {
        $q->where('sequence', 7);
    })
    ->whereDoesntHave('tags', function($q) {
        $q->where('sequence', '>', 7);
    })->get();

推荐阅读