Laravel 5.3.
包模型有许多步骤模型.Step Model有一个列调用,status其类型为tiny int和created_atcolumn.例如,一个包A,具有以下步骤:
并且,包B,具有以下步骤:
就像那样,许多包,每个包都有很多步骤.
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)
但它仍然无效.
那么,正确的方法是什么?非常感谢你.
这是相当具有挑战性的。我想不出一个可以通过执行单个 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
| 归档时间: |
|
| 查看次数: |
354 次 |
| 最近记录: |