Laravel “拉雷维尔”;何处有;加上;以“为例;

Laravel “拉雷维尔”;何处有;加上;以“为例;,laravel,eloquent,Laravel,Eloquent,我有一段感情: 员工:id |姓名 就业:id |员工id |公司id |开始日期|结束日期|终止类型|id 一名员工可以在一段时间内拥有多份工作。我需要根据employments中的最后/one行雇用员工,这就是我失败的原因。我在Employee.php模型中设置了以下内容: 在Employee.php模型中: public function latestEmployment() { return $this->hasMany(Employment::class)->order

我有一段感情:

员工:id |姓名

就业:id |员工id |公司id |开始日期|结束日期|终止类型|id

一名员工可以在一段时间内拥有多份工作。我需要根据employments中的最后/one行雇用员工,这就是我失败的原因。我在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考虑了整个表,不管我接下来写什么

谢谢你的帮助

编辑:


< P> >代码>第一个()/<代码>,代码> GET()/<代码>等。在中间执行查询,因此我不能使用它。重要的是,整个查询需要是一个构建器,因为我在最后需要一个
paginate()

最简单的解决方案是获取所有员工,然后对他们进行筛选:

public function latesteemployment(){
返回$this->hasOne(Employment::class)->orderBy('start_date','DESC');
}
雇员::with('latesteemployment')->get()
->其中('latestEmployment.termination\u type\u id',null);
仅获取相关员工的查询:

Employee::选择('employees.*')
->加入('employments'、'employees.id'、'employments.employeer\u id')
->其中NULL('终止类型\ id')
->其中('start_date',函数($query){
$query->selectRaw('max(开始日期)'
->来自(‘雇员’)
->其中列('employee_id','employees.id');
})->get();

试试这样的方法

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

使用
->first()
而不是
->take(1)
@NullCod3
take()
limit()
如果检索到多个父模型,则函数将无法进行快速加载。@HH-我认为我不能只使用->first()。它不在“hasMany”中,我不能在Builder和whereHas中使用它。是的,这是我不想做的解决方案,先做get()然后过滤。特别是因为我在末尾有一个paginate(),它也可以在查询中完成,但这更复杂。你想要一个查询解决方案吗?如果你知道如何在查询的中间不做GET()、FiST()和PyInAuto(),那么,是的!我已经试了好几天了!重要的是,最后我可以在生成器上执行paginate()谢谢,但仍然不接受$join子句中的最后一行。