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

具有多对多关系的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+行 失败

我正在按公司和/或类别进行搜索。 输出应该是上市公司,每个公司输出一个或多个类别(&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。如果你觉得有困难,我会尝试写一篇关于这方面的文章。