Laravel 如何查詢一個模型的含有特定條件的最新的關聯模型?

我剛剛在 StackOverflow 上提的問題,求解答。

http://stackoverflow.com/questions/4013551...

一個 Package 模型,有許多 Step 模型。Step 的字段中有這樣兩條,tinyint 型 status 字段和 時間戳字段。
假設一個 Package A,有下列 steps

  • 18號10點,status 爲 1
  • 19號9點,status 爲 2

假設一個 Package B,有下列 steps

  • 19號8點,status 爲 1
  • 19號9點,status 爲 2
  • 19號10點,status 爲 3

這樣 A 的最新 step status 是 2,B 是 3.

然後,如何查詢出最新 step status 爲 2 的 packages?

我嘗試在 package 模型中加入

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();

但是卻不能得到期望的結果。

所謂不是期望的結果,指的是,如果,packages 表 裏面,衹有 B 這一個,我想查詢出最新 step status 爲 2 的 packages,B 最新是 3 所以應該結果爲空,但這樣查詢出結果并不是空,而是包含了 B。

然後我試著換成

public function status()
{
    return $this->hasOne('App\Step')->latest();
}

也還是一樣。

剛學 Laravel ,遇到這個問題很困惑,也查了很多 Google ,都沒有想要的答案。希望大家幫幫我,多謝!

用的 Laravel 5.3

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 4
select `package_id` from (
    select * from (
        select * from `steps` order by time desc
    ) as tb1 group by `package_id`
) as tb2 where status = 2;

随手写的 没测试过,中间那层查询是获取每个package最新的step,外层的查询获取status=2的package_id,应该还有更简单的办法吧

7年前 评论

不知道有没有一步到位的方法,可以试试在查找后再筛选一次。

主要是没办法直接在数据库中查找最新的记录吧,必须先取得结果排序才能获取最新的记录。

$packages = Package::whereHas('steps', function($query){
    $query->orderBy('created_at', 'desc');
})->all()
  ->filter(function($package){
    return $package->steps->first()->status == 2;
});
7年前 评论

随手写的,发现有点问题,应该用get()....,另外直接用with预加载以免后面判断时又得查询数据库。。。

$packages = Package::with('steps', function($query){
    $query->orderBy('created_at', 'desc');
})->get()
  ->filter(function($package){
    return $package->steps->count()>0 && $package->steps->first()->status == 2;
});
7年前 评论

@song
@oustn 多謝你們,我決定改數據庫模型,在 Package 表里加一個 current_step_id 然後手工更新它。

7年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!