【发布时间】:2020-06-01 22:05:09
【问题描述】:
在 sql 中查询这个突击队正是我想要的:
SELECT
v.id,
(
SELECT sv.status_id
FROM status_viagem sv
WHERE sv.viagem_id = v.id
ORDER BY sv.created_at DESC LIMIT 1 ) AS status_id
FROM viagens v
这里是sql结果:
但我不知道如何使用 Laravel eloquent 来做到这一点
基本上,一个 viagem 条目可以有很多状态,但我需要从 status_viagem 表(数据透视表)中获取每个 viagem 及其最后一个状态条目
顺便说一句 viagem/viagens 的意思是旅行。
我的班级映射:
class Viagem extends Model
{
...
public function status()
{
return $this->belongsToMany('App\Status')->withTimestamps();
}
...
}
class Status extends Model
{
public function viagens()
{
return $this->belongsToMany('App\Viagem')->withTimestamps();
}
}
两个班级的 belongsToMany 都让我获得了多对多:
有人可以帮助我吗?谢谢
--------- 临时解决方案 --------
感谢大家的帮助。事实上,我找不到仅使用 eloquent 的好解决方案。
第 1/3 步 - 为了绕过这种情况,我首先执行上述 sql 以仅获取所需 status_id 下的 viagens(最后一个 status_viagem 条目):
$viagens_ids = DB::select(
"SELECT viagem_id FROM (
SELECT
v.id AS viagem_id,
(
SELECT sv.status_id
FROM status_viagem sv
WHERE sv.viagem_id = v.id
ORDER BY sv.id DESC LIMIT 1 ) AS status_id
FROM viagens v
) AS tt
WHERE tt.status_id = {$status->id}"
);
第 2/3 步 - 然后我使用 array_map 来组织我的 viagens ids
$a = array_map(
function($obj) { return $obj->viagem_id; },
$viagens_ids
);
第 3/3 步 - 最后我使用了 elequent whereIn 来获取我的 viagens:
Viagem::with( 'status')->whereIn('id', $a)->get();
事实上,我已经通过一种老套路的方式解决了这个问题,但我对此并不满意,因为我希望我能学会如何使用 eloquent 来解决这个问题。对我有什么不好。
【问题讨论】:
-
嗨乔纳森,你试过约束急切加载吗?类似
Viagem::with('status', function($query){ return $query->orderBy('created_at', 'desc')->first(); }。你可以使用toSql查看生成的sql查询。 -
嗨@bagus,我们快到了。我使用这个命令:``` $viagens = Viagem::with(['status' => function ($query) { $query->orderBy('created_at', 'desc')->first(); }] )->get(); ``` 但它不像 sql 命令那样工作并且显示错误的结果。