php - 拉拉维尔。如何查找具有特定最新相关模型的模型

标签 php laravel

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/

相关文章:

javascript - 在 javascript 中查询 php json_encode 结果

php - PDO PHP MySQL 中的正则表达式

php - 如何使用TCPDF生成PDF417二维条码?

php - Laravel 5.5,获取下一个/上一个 Eloquent 模型,按字母顺序排序 ‘slugs’

php - Laravel 5.2 模型 $fillable 被忽略了吗?

php - 使用外键从现有表创建 slug

php - 表达式不允许作为字段默认值(在 oop 上)

php - 内存使用随着 Doctrine 批量插入变得疯狂

image - Laravel 移动上传的文件

laravel - 为什么我们需要像Pusher、Socket.io这样的产品来建立websocket连接?