我有一个可以有多个标签的模型,关系定义如下:
public function tags()
{
return $this->belongsToMany(ListTag::class, 'listing_listtag', 'listing_id', 'tag_id');
}
和内部标签模型我有:
public function listings()
{
return $this->belongsToMany(Listing::class, 'listing_listtag');
}
我正在制作一个过滤器,用户可以选择一些标签,我应该只返回分配了所有这些标签的模型。
例如,如果我选择" tag_1"这将返回分配给它们的所有模型。我遇到的问题是用户是否选择" tag_1"和" tag_2"我只需要返回同时分配了这些模型的模型,而不是只分配了其中一个模型的模型。
目前我有这个:
$listings = Listing::closest($lat, $lng, $radius)
->orderBy('distance');
if($request->tags){
$listings->whereHas('tags', function($query) use($filter_tags) {
foreach ($filter_tags as $filter_tag) {
$query->where('slug', $filter_tag);
}
});
$append += array('tags' => $request->tags);
}
但是返回0,即使我选择了其中一个模型分配给它的两个标签,所以至少应该返回模型。
代码看起来不错吗?
生成此查询:
"query" => """
select count(*) as aggregate from `listings` where (6371 * acos(cos(radians(55.6181338)) \n
* cos(radians(lat)) \n
* cos(radians(lng) \n
- radians(13.0274283)) \n
+ sin(radians(55.6181338)) \n
* sin(radians(lat)))) < ? and exists (select * from `listtags` inner join `listing_listtag` on `listtags`.`id` = `listing_listtag`.`tag_id` where `listing_listtag`.`listing_id` = `listings`.`id` and `slug` = ? and `slug` = ?)
"""
"bindings" => array:3 [▼
0 => "5"
1 => "wireless-internet"
2 => "delivery"
]
答案 0 :(得分:1)
为什么不查询逆向:
$tags = Tag::query()->where('name, 'bla');