我按公司和/或类别构建搜索。 输出应该是上市公司,每个&每个公司输出一个或多个类别。
1公司1 2公司2 3公司3
1主持 2域名 3硬件
现在我的问题是如何构建ORM查询以便我可以过滤类别?按公司过滤很容易实现,但我坚持按类别过滤。
例如我希望实现的输出。
公司条目约为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);
有2个模态
公司
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');
}
答案 0 :(得分:0)
你可以这样做:
$companies = Company::has('categories')->get();
结果将是至少有一个类别的公司。我想这就是你要找的东西。
答案 1 :(得分:0)
由于您使用的是Laravel,因此这很容易。在您的代码中,所有处理(过滤)都由数据库服务器完成,因此需要花费太多时间,但还有另一种方法。
使用即可获取所有记录
Companies::with('categories')->get();
这将为您提供Collection对象,您可以按照自己的方式处理/过滤。您可以使用where, orderBy, sortBy
类型的函数,数据库服务器处理的上述代码现在可以由服务器处理,还有更多可用的函数。