2017-02-03 15 views
0

特定のタグを持つモデルを返す方法、関係は次のように定義されては、私はもっとして1個のタグを持つことができるモデルを持っている

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

は、なぜあなたは逆照会しません:where句で

  • タグを(例えば$tags = Tag::query()->where('name, 'bla');
  • は後に買ってhasOneの関係を定義しますリスティング?(または、他のモデル、これが我々が話しているモデルであるかどうかは本当にはっきりしない)
  • タグをループして関係を呼び出すことでそれを得る
+0

カテゴリ、タグ、およびその他のモデルがメインモデルに結び付けられているため、逆はできません。メインモデルから選択する必要があります –

+1

@Maxlightこれがなぜ正確に動作しないのか説明できますか?関係が別のテーブルを介している場合は、hasmanytroughtを使用することができます。https://laravel.com/docs/5.4/eloquent-relationships#has-many-through –

+1

こんにちはThomasさん、ありがとうございます。私はここでそれについての質問を投稿したクエリ:http://stackoverflow.com/questions/42025039/return-rows-with-specific-tagあなたはSQLと良いと見てみたい場合は、ありがとう –

関連する問題