我有一些桌子。
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匹配。
我还有其他表与产品表有很多关系。
答案 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;