【问题标题】:Laravel "whereHas" with "take"Laravel "whereHas" 与 "take"
【发布时间】:2018-09-18 20:33:55
【问题描述】:

我正在谈恋爱:

员工:id |名字

工作:id |员工编号 | company_id |开始日期 |结束日期 |终止类型ID

随着时间的推移,一名员工可以从事多项工作。我需要根据就业中的最后/一个行找到受雇的员工,这就是我失败的地方。我已经在我的模型 Employee.php 中设置了这个:

在Employee.php 模型中:

public function latestEmployment() {
  return $this->hasMany(Employment::class)->orderBy('start_date', 'DESC')->take(1);
}

关于过滤:

$employees->where(function ($query) {
  $query->whereHas('latestEmployment', function($subquery) {
    $subquery->whereNull('termination_type_id');
  }
});

在我看来,我需要在某个地方进行一些急切的加载,因为 ->take(1) 不能那样工作。这里 whereHas 考虑到整个表,不管我接下来写什么。

感谢您的帮助。

编辑:

执行first()get() 等会在中间执行查询,所以我不能使用它。重要的是整个查询需要是一个 Builder,因为最后我需要一个 paginate()

【问题讨论】:

  • 使用->first() 而不是->take(1)
  • 如果您检索多个父模型,@NullCod3 take()limit() 函数将不适用于预加载。
  • @HH - 我认为我不能只使用 ->first()。它不在“hasMany”中,我不能在 Builder 中使用它,然后在 whereHas 中使用它。

标签: laravel eloquent


【解决方案1】:

最简单的解决方案是获取所有员工并在事后过滤他们:

public function latestEmployment() {
    return $this->hasOne(Employment::class)->orderBy('start_date', 'DESC');
}

Employee::with('latestEmployment')->get()
    ->where('latestEmployment.termination_type_id', null);

只获取相关员工的查询:

Employee::select('employees.*')
    ->join('employments', 'employees.id', 'employments.employee_id')
    ->whereNull('termination_type_id')
    ->where('start_date', function($query) {
        $query->selectRaw('max(start_date)')
            ->from('employments')
            ->whereColumn('employee_id', 'employees.id');
    })->get();

【讨论】:

  • 是的,这是我不想做的解决方案,首先做一个 get() 然后过滤。特别是因为我最后有一个 paginate()。
  • 也可以在查询中完成,但这更复杂。您想要查询解决方案吗?
  • 如果您知道如何在查询中间不执行 get()、first() 和 paginate() 的情况下做到这一点,是的!我试了好几天!重要的是我可以在最后对 Builder 执行 paginate() 。 :)
【解决方案2】:

试试这样的东西

Employee::select('employees.*')->join('employments', function ($join) {
            $join->on('employees.id', '=', 'employments.employee_id')
                 ->whereNull('emails.termination_type_id');
        })->distinct()->paginate(15);

【讨论】:

  • 谢谢,但仍然没有只取 $join 子句中的最后一行。
猜你喜欢
  • 1970-01-01
  • 2020-09-16
  • 2014-01-11
  • 2020-12-23
  • 2021-05-25
  • 2017-09-21
  • 1970-01-01
  • 2018-10-18
  • 2021-09-05
相关资源
最近更新 更多