Laravel.如何找到具有特定最新相关型号的型号

Boh*_*ang 5 php laravel

Laravel 5.3.

包模型有许多步骤模型.Step Model有一个列调用,status其类型为tiny int和created_atcolumn.例如,一个包A,具有以下步骤:

  • 10月18日10:00,状态1
  • 10月19日09:00,状态2

并且,包B,具有以下步骤:

  • 10月19日08:00,状态1
  • 10月19日09:00,状态2
  • 10月19日10:00,状态3

就像那样,许多包,每个包都有很多步骤.

A最新一步的状态是2,而且B是3

我的问题是,如何查找最新步骤状态为2的包?预期的结果是包的集合,在此示例中应包含A.

我试过在我的包模型中添加它.

public function steps()
{
    return $this->hasMany('App\Step');
}

public function status()
{
    return $this->steps()->latest()->limit(1);
}
Run Code Online (Sandbox Code Playgroud)

和查询

Package::whereHas('status', function ($q) {
    $q->where('status', 2);
})->get();
Run Code Online (Sandbox Code Playgroud)

但无法得到预期的结果.

不期望的是,如果Packages Table只有1行,则Package B,预期结果为空集合.但它返回一个包含的集合B.

我也尝试将Package Model中的状态函数更新为

public function status()
{
    return $this->hasOne('App\Step')->latest();
}
Run Code Online (Sandbox Code Playgroud)

但它仍然无效.

那么,正确的方法是什么?非常感谢你.

Arm*_*Sam 1

这是相当具有挑战性的。我想不出一个可以通过执行单个 Eloquent 查询来实现您想要的解决方案。然而,我找到了一种方法,可以通过两个步骤为您提供结果 -即查询+过滤

但在此之前,您需要向模型添加范围Package

public function scopeOfStatus($query, $status)
{
    return $query->whereHas('steps', function($q) use ($status) 
    {
        $q->where('status', $status);   
    });
}
Run Code Online (Sandbox Code Playgroud)

第 1 步:编写一个查询,检索至少有一个步骤与给定状态匹配的所有包:

$status = 1;
$packages = Package::with('steps')->ofStatus($status)->get();
Run Code Online (Sandbox Code Playgroud)

第 2 步:过滤结果以仅获取最后一步与您给定状态匹配的包:

$packages = $packages->filter(function($package) use ($status)
{
    return $package->steps->last()->status == $status;
});
Run Code Online (Sandbox Code Playgroud)

最终结果是他们最后一步拥有的所有包的集合status == 1