首页 文章

Laravel 5.2在多对多关系中进行条件查询

提问于
浏览
0

我有一些 table .

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

我还有其他表与产品有很多关系 . 我在这样的产品模型中 Build 了多对多的关系 .

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

我想要的是按关键字搜索 . 说我有一些关键词

['shirts','pant']

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

我希望此关键字与tag_name匹配,并通过product_tags表检索与tag_id相关联的产品以及所有此类关键字 Headers 的产品 .

示例:产品表

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 回答

  • 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();
    
  • 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;
    

相关问题