说,我有两个存在多对多关系的实体:
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)
答案 0 :(得分:2)
您可能正在寻找的是$posts = Post::whereHas('tags', function ($q) {
$q->where('sequence', 7);
})
->whereDoesntHave('tags', function($q) {
$q->where('sequence', '>', 7);
})->get();
NAME TYPE VALUE
-------------------------------------------------- ----------- ----------------------------------------------------------------------------------------------------
archive_lag_target integer 0
db_big_table_cache_percent_target string 0
db_flashback_retention_target integer 1440
fast_start_io_target integer 0
fast_start_mttr_target integer 0
memory_max_target big integer 0
memory_target big integer 0
parallel_servers_target integer 64
pga_aggregate_target big integer 816M
sga_target big integer 2448M
答案 1 :(得分:1)
您真正需要的是检查是否等于和小于,就像这样:
$posts = Post::whereHas('tags', function($q) {
$q->where('sequence', '<=', 7);
})->get();