【问题标题】:Laravel with eager loading using condition使用条件进行急切加载的 Laravel
【发布时间】:2018-02-20 23:04:02
【问题描述】:

我正在尝试使用预先加载优化关系并在 with 子句中实现预先加载的条件,但是当我执行以下操作时:

 $totalOpenQry =  Enquiry::whereIn('staff_id', $employeeIds)
            ->with(['enquiryStats' => function ($query) {
                $query->where('is_open','=',true)
                    ->where('is_dead','=',false)
                    ->orderBy('id','asc');
            }])
            ->where('ed_timestamp', '>=', $dateRange['start'])
            ->with('country');

        $totalOpen = $totalOpenQry->toSql();

$totalOpenQry->toSql()

产生以下内容:

'select * from `enquiries` where `staff_id` in (10, 15) and `ed_timestamp` >= '2017-09-12';

似乎忽略了我的 with 子句中的 where 条件。有没有办法解决这个问题或正确实施它?

谢谢

【问题讨论】:

  • 你使用的是哪个 laravel 版本?
  • 关系没有加载到同一个查询中。急切加载仍然会运行额外的查询来加载数据,而不是每行额外的查询。
  • 使用 Laravel 5.3。 @Devon,我想我可以渴望使用 with? 加载关系?我的结果似乎完全忽略了 is_open 和 is_close
  • 我推荐使用 Laravel Debugbar。它将向您显示所有运行的查询。急切加载的查询将直接在此查询之后。

标签: php laravel eloquent


【解决方案1】:

whereHas() 的工作原理与has() 基本相同,但允许您为相关模型指定额外的过滤器以进行检查。

$totalOpenQry =  Enquiry::whereIn('staff_id', $employeeIds)
        ->with('enquiryStats')
        ->whereHas('enquiryStats', function ($query) {
            $query->where('is_open','=',true)
                ->where('is_dead','=',false)
                ->orderBy('id','asc');
        })
        ->where('ed_timestamp', '>=', $dateRange['start'])
        ->with('country');
// only  enquiryStats that have is_open = true and is_dead = false are returned

【讨论】:

  • whereHas 根据代码库接受参数ref link
  • 添加一个关于它的作用的解释,我会支持它。
  • 这解决了我的问题。谢谢@Mr.Pyramid
  • 是的,我已经添加了解释
【解决方案2】:

你会得到 2 个查询:

1: 'select * from `enquiries` where `staff_id` in (10, 15) and `ed_timestamp` >= '2017-09-12';

2 Something like: 'select * from `stats` where `staff_id` in (10, 15) AND `is_open`=true...;

->toSql() 只显示第一个。

【讨论】:

  • 也许我理解错了,但我需要两者都是同一个查询,这样才能限制我的结果集?
  • @liamjnorman 您是否要限制查询或统计信息?
  • 我正在尝试使用相关的 enquiryStats 加载查询,然后根据 enquiryStats 限制我获得多少查询的结果
  • 那么你想要 whereHas 在另一个答案中。 with() 上的条件只会约束相关数据的结果。
猜你喜欢
  • 1970-01-01
  • 2016-07-04
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多