我正在使用Laravel和Ajax实现搜索。所以我有一个属于标签和子类别的产品。另一方面,子类别属于一个类别。我想检查它们的所有属性(字段值),并检查它们是否包含给定的字符串。经过一番搜索,我发现我必须使用LIKE
。以下是我尝试过的:
$products = Product::where('name_en', 'LIKE', $search)->get();
但是,如果搜索字符串与值完全匹配,则会得到产品。如果它包含它,我想匹配。如何处理belongsTo关系?如何检查Tag和Subcategory的属性?如何将所有的事情联系在一起,从而达到预期的结果?提前谢谢。
如果您做错了一件事,您的查询会返回完全匹配的结果,因为您给出了完全匹配的字符串。但您的查询应该是这样的。
$products = Product::where('name_en', 'LIKE', '%'.$search.'%')->get();
上面的查询将提供包含搜索字符串的产品。
如果你想在关系表中搜索,那么你可以使用laravel方法join()
。但是还有一个方法whereHas
,但我总是避免使用这个方法,因为它会创建非常复杂的查询。它非常重。因此,您可以使用join()
方法,该方法将inner join
添加到关系表中。
以下是join的示例:
$products = Product::join('tags', function($builder) {
$builder->on('tags.id', '=', 'products.tag_id');
// here you can add more conditions on tags table.
})
join('sub_categories', function($builder) {
$builder->on('sub_categories.id', '=', 'products.tag_id');
// here you can add more conditions on subcategories table.
})
->where('name_en', 'LIKE', '%'.$search.'%')
->get();
这是一个基本的例子,您可以根据自己的要求使用它。
要添加到Lakhwinder Singh的答案中,可能值得将其封装在一个可以应用于您的模型的范围中:
class Product extends Model
{
public function scopeSearch($query, $keywords)
{
return $query->where('name_en', 'LIKE', '%'.$keywords.'%');
}
}
然后你可以像这样使用这个范围:
$products = Product::search($keywords)->get();
这意味着您不必在整个应用程序中手动添加"LIKE"条件。
顺便说一句,Laravel在5.3版中引入了Scout,这是Eloquent的一个基于驱动程序的全文搜索扩展。
您想要的是编写一个高级查询来搜索基于相关模型的产品,因此正如其他人之前建议的那样,您必须编写联接语句。
查看我下面的示例代码,它是为搜索成员而写的,如果字符串匹配,搜索字符串也会带来成员、成员技能或职位,所以这肯定会对你有所帮助。
$users = User::select('app_users.*')
->distinct()
->join('app_members', 'app_users.id', '=', 'app_members.app_users_id')
->leftJoin('app_members_jobtitles', 'app_members.id', '=', 'app_members_jobtitles.app_members_id')
->leftJoin('app_jobtitles', 'app_members_jobtitles.app_jobtitles_id', '=', 'app_jobtitles.id')
->leftJoin('app_members_tags', 'app_members.id', '=', 'app_members_tags.app_members_id')
->leftJoin('app_technologies', 'app_members_tags.app_technologies_id', '=', 'app_technologies.id')
->whereNull('app_users.activation')
->where('app_users.block','=',0)
->where(function ($query)use ($search) {
$query->orWhere('app_users.first_name', 'like', '%'.$search.'%')
->orWhere('app_users.last_name', 'like', '%'.$search.'%')
->orWhere('app_members.company', 'like', '%'.$search.'%')
->orWhere('app_members.job_title', 'like', '%'.$search.'%')
->orWhere('app_jobtitles.title', 'like', '%'.$search.'%')
->orWhere('app_technologies.title', 'like', '%'.$search.'%')
->orWhere('app_members.summary', 'like', '%'.$search.'%');
})
->get();
注意上面代码中的以下连接,它在您的案例类别和子类别中
->leftJoin('app_members_jobtitles', 'app_members.id', '=', 'app_members_jobtitles.app_members_id')
->leftJoin('app_jobtitles', 'app_members_jobtitles.app_jobtitles_id', '=', 'app_jobtitles.id')