Laravel ORM过滤器具有多对多的关系

时间:2016-03-08 17:46:59

标签: laravel laravel-5

我按公司和/或类别构建搜索。 输出应该是上市公司,每个&每个公司输出一个或多个类别。

表"公司"

id name

1公司1 2公司2 3公司3

表"类别"

id name

1主持 2域名 3硬件

列出所有结果

  1. 公司1,(类别=主机,域名)
  2. 公司2,(类别=域名硬件)
  3. 公司3,(类别=硬件托管)
  4. 现在我的问题是如何构建ORM查询以便我可以过滤类别?按公司过滤很容易实现,但我坚持按类别过滤。

    例如我希望实现的输出。

    过滤域名,输出

    1. 公司1,(类别=主机,域名)
    2. 公司2,(类别=域名硬件)
    3. 公司条目约为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');
      }
      

2 个答案:

答案 0 :(得分:0)

你可以这样做:

$companies = Company::has('categories')->get();

结果将是至少有一个类别的公司。我想这就是你要找的东西。

答案 1 :(得分:0)

由于您使用的是Laravel,因此这很容易。在您的代码中,所有处理(过滤)都由数据库服务器完成,因此需要花费太多时间,但还有另一种方法。

使用即可获取所有记录    Companies::with('categories')->get(); 这将为您提供Collection对象,您可以按照自己的方式处理/过滤。您可以使用where, orderBy, sortBy类型的函数,数据库服务器处理的上述代码现在可以由服务器处理,还有更多可用的函数。