具有多对多关系的Laravel ORM过滤器
我正在按公司和/或类别进行搜索。 输出应该是上市公司,每个公司输出一个或多个类别(&E) 表“公司” 身份证名称 1公司1 2公司2 3公司3 表“类别” 身份证名称 1托管 2域 3硬件 列出所有结果具有多对多关系的Laravel ORM过滤器,laravel,laravel-5,Laravel,Laravel 5,我正在按公司和/或类别进行搜索。 输出应该是上市公司,每个公司输出一个或多个类别(&E) 表“公司” 身份证名称 1公司1 2公司2 3公司3 表“类别” 身份证名称 1托管 2域 3硬件 列出所有结果 公司1,(类别=托管,域) 公司2,(类别=域硬件) 公司3,(类别=硬件托管) 现在我的问题是如何构建ORM查询,以便筛选类别?按公司筛选很容易实现,但我坚持按类别筛选 我希望实现的输出 过滤域,输出 公司1,(类别=托管,域) 公司2,(类别=域硬件) 公司条目约20k行,类别1k+行 失败
$companies = Companies
::with(['categories'=>function($q)use($category){
if (isset($category)){
$q->where('slug','=',$category->slug);
}
}])->paginate(20);
查询时,只过滤公司模式内的类别
$companies = Companies::whereHas('categories',function($q)use($category){
$q->where('categories.id','=',$category->id);
})
->paginate(20);
有两个情态动词
公司
public function categories(){
return $this->belongsToMany('App\Models\Categories','companies_categories','company_id','category_id');
}
public function companies(){
return $this->belongsToMany('App\Models\Companies','companies_categories','category_id','company_id');
}
类别
public function categories(){
return $this->belongsToMany('App\Models\Categories','companies_categories','company_id','category_id');
}
public function companies(){
return $this->belongsToMany('App\Models\Companies','companies_categories','category_id','company_id');
}
您只需执行以下操作:
$companies = Company::has('categories')->get();
结果将是至少有一个类别的公司。我想这就是您要找的。因为您使用的是Laravel,所以这很容易。在您的代码中,所有的处理(过滤)都是由数据库服务器完成的,因此需要花费太多的时间,但还有另一种方法 只需使用
companys::with('categories')->get()代码>
这将为您提供可以按任何方式处理/过滤的对象。您可以使用where、orderBy、sortBy
这样的函数,在上面的代码中,由数据库服务器处理的函数现在可以由服务器处理,而且还有更多可用的函数。也尝试了这种方法。但是它占用了资源&需要超过20分钟才能返回。由于记录为20k个公司和1k个类别……如果这些记录没有变化,那么您可以使用redis
进行缓存,以存储get
query的结果。可以参考任何示例来实现它?您可以查看redis的官方文档。这很容易。也可以查看Laravel Redis。如果你觉得有困难,我会尝试写一篇关于这方面的文章。