如何返回具有特定标记的模型

时间:2017-02-03 12:42:15

标签: laravel

我有一个可以有多个标签的模型,关系定义如下:

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"
]

1 个答案:

答案 0 :(得分:1)

为什么不查询逆向:

  • 带有where子句的标记(例如$tags = Tag::query()->where('name, 'bla');
  • 将标签上的hasOne关系定义为Listing? (或其他模式,如果这是我们正在讨论的模型,你真的不清楚)
  • 通过循环标记并调用关系
  • 来获取它