Laravel 5.2多条关系中的条件查询

时间:2016-01-18 11:11:08

标签: laravel eloquent many-to-many laravel-5.2

我有一些桌子。

products(product_id(pk),title)
product_tag(id(pk),tag_id(fk),product_id(fk))
tags(tag_id(pk),tag_name)

我还有其他表与产品有多对多的关系。 我在这样的产品模型中建立了多对多的关系。

 public function productTags()
{
    return $this->belongsToMany("App\Model\TagModel","product_tags","product_id","tag_id");
}

我想要的是按关键字搜索。假设我有一些像

这样的关键字
['shirts','pant']

关键字数组可以包含单个项目或多个项目。

我希望这些关键字与tag_name匹配,并通过product_tags表格检索与tag_id相关联的产品以及所有此类关键字标题的产品。

实施例: 产品表

product_id    title
  1            half sleeve shirt
  2            full sleeve shirt
  3            pants
  4            women jeans

product_tag表

  product_id       tag_id
      1               1
      2               1
      3               2
      4               3

标签表

     tag_id         tag_name
       1               mens
       2               pant
       3               women

现在我的搜索关键字数组就像

['shirt','pant']

结果应该匹配产品表中的前三个产品。前两个产品与关键字直接匹配,第三个产品与tag_id匹配。

我还有其他表与产品表有很多关系。

2 个答案:

答案 0 :(得分:2)

如果您为标记使用外部数组,则可以使用此代码段。

$tag = ['shirts','pant'];
Product::where(function($query) use($tag){
           $query-> whereHas('tags',function($query) use($tag){
               $query->whereIn('name',$tag);
           });
       })
        ->orWhere(function($query) use($tag){
            for($i=0;$i<count($tag);$i++){
                $query->orWhere('name','like','%'.$tag[$i].'%');
            }
        })
    ->get();

答案 1 :(得分:0)

在你的SearchController中尝试这样的事情:

$searchString = Input::get('search');
$results = [];

//search after product name
$products = Product::whereRaw('title LIKE ?', ["%$searchString%"])->get();

//insert each product in result array
foreach($products as $product) {
    $results[] = $product; 
}

//search after tag
$tags = Tag::whereRaw('tag_name LIKE ?', ["%$searchString%"])->get();

//insert each tag in results array
foreach($tags as $tag) {
    foreach($tag->products as $product) {
        //check if product exists in results array
        if (!in_array($product, $results)) {
            $results[] = $product;
        }
    }
}

return $results;