考虑这个代码

$amUser = User::where('status',1)->get();
$data=[];
foreach($amUser as $a){
    $salescalls = $a->salesCall();
    if (isset($request->corporate_name))
    {
        $salescalls=$salescalls->where('corporate_name','like','%'.$request->corporate_name.'%');
    }
    if (isset($request->start_date))
    {
        $salescalls=$salescalls->whereDate('sales_calls.created_at','>=',$request->start_date);
    }
    if (isset($request->end_date))
    {
        $salescalls=$salescalls->whereDate('sales_calls.created_at','<=',$request->end_date);
    }
    $data[$a->id]=$salescalls->get();
    $grandTotal['sum']+=$salescalls->count();
}

正如您所见,它将在每个循环上执行salesCall()查询,并产生n+1问题,但如果我急于加载$amUser->load('salesCall'),我无法执行whereDatequery,因此我的策略是构建所有where条件,然后填充所有用户id,然后在一次执行中将它们组合在一起,但我不知道如何填充所有这些where条件,并在以后调用它们.怎么做或者有什么建议?

推荐答案

构建查询时,可以使用with方法指定应加载哪些关系:

$amUser = User::with('salescalls')
    ->where('status', 1)
    ->get();

有时,您可能希望Eager 地加载关系,但也要为Eager 地加载查询指定其他查询条件.可以通过向with方法传递一个关系数组来实现这一点,其中数组键是一个关系名称,数组值是一个闭包,该闭包会为即时加载查询添加额外的约束:

$amUser = User::with(['salescalls' => function($query) use ($request){
    if($request->corporate_name){
        $query->where('corporate_name', 'like', '%' . $request->corporate_name . '%');
    }

    if($request->start_date){
        $query->whereDate('created_at', '>=', $request->start_date);
    }

    if($request->end_date){
        $query->whereDate('created_at', '<=', $request->end_date);
    }
}])->where('status', 1)->get();

所以你不需要用foreach.Eager 加载缓解了"N+1"查询问题.

哦,顺便说一句,你也可以使用when method.


But I want to only retrieve salescalls data

是的,你可以:

$data = $amUser->pluck('salescalls');

Then, how to count data? (without empty collection)

$grandTotal = $amUser->pluck('salescalls')->flatten()->count();

Laravel相关问答推荐

如何在 Laravel 中使用多对一变形关系

如何在数据来自Rest API的flutter中创建下拉类别名称列表?

Laravel 5.4 中的自定义助手类

Laravel:如何通过 id 从集合中删除项目

.gitignore 不忽略文件夹

带有 Laravel Passport 的 SSO

Laravel transformer vs resource

Laravel 5 - 没有重叠的任务计划不起作用

使用'with'时,Laravel belongsTo 返回 null

不支持驱动Driver[] - Laravel 5.3

如何在 Laravel 中实现自己的 Faker 提供程序

如何在本地 Laravel Homestead 站点上获取 https 证书

如何使用命令行手动运行 laravel/lumen 作业(job)

验证匹配字符串

Lumen/Laravel 6:调用未定义的函数 array_except()

如何判断是否连接到 Laravel 4 中的数据库?

在 Laravel 中软删除父记录时如何软删除相关记录?

在 Laravel 中翻译特定语言

如果参数不是整数,如何以不同方式定义路由

连接到 tcp://smtp.mail.yahoo.com:465 超时