Laravel 5.3。
一个包模型有很多步骤模型。
Step Model 有一个名为 status
的列,其类型为 tiny int 和 created_at
列。
例如,一个包A
,有这些步骤:
- 十月。 18 10:00,状态 1
- 十月。 19 09:00,状态 2
并且,包 B
具有以下步骤:
- 十月。 19 08:00,状态 1
- 十月。 19 09:00,状态 2
- 十月。 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);
}
和查询
Package::whereHas('status', function ($q) {
$q->where('status', 2);
})->get();
却得不到预期的结果。
没有预料到的是,如果包表只有 1 行,包 B
,预期结果是一个空集合。但它返回一个包含 B
的集合。
我还尝试将包模型中的状态函数更新为
public function status()
{
return $this->hasOne('App\Step')->latest();
}
但还是不行。
那么,怎样才是正确的做法呢?非常感谢你。
最佳答案
这非常具有挑战性。我想不出一个解决方案,您可以通过执行单个 Eloquent 查询来实现您想要的。但是,我找到了一种方法,可以分两步为您提供结果 - 即查询 + 过滤器。
但在此之前,您需要向您的Package
模型添加一个作用域:
public function scopeOfStatus($query, $status)
{
return $query->whereHas('steps', function($q) use ($status)
{
$q->where('status', $status);
});
}
第 1 步:编写一个查询,以检索至少有一个步骤与给定状态匹配的所有包:
$status = 1;
$packages = Package::with('steps')->ofStatus($status)->get();
第 2 步: 过滤结果以仅获取其最后一步与给定状态匹配的包裹:
$packages = $packages->filter(function($package) use ($status)
{
return $package->steps->last()->status == $status;
});
最后的结果是他们最后一步有status == 1
的所有包的集合
关于php - 拉拉维尔。如何查找具有特定最新相关模型的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40135511/