我正在尝试查询数据库以仅获取状态为'CONFIRMED'的行,但是该状态保存在Log表中,而不保存在需要执行查询的事件中。 logs
表存储所有手术状态,ID为1的手术的当前状态是插入surgery_id
1的最后一行。我如何获得手术状态为{{1 }}?
这是我的数据库结构:
CONFIRMED
我正在使用带有PostgreSQL数据库的laravel v5.7.28。
在 Surgery Events Log
id id id
patient_id surgery_id surgery_id
status_id
模型上:
surgery
如果我使用以下代码,而不是第一个,则我可以成功获取最后一个状态:
public function status()
{
return $this->hasMany(Cirurgia_log::class)
->orderBy('created_at', 'desc');
}
但是,对于这一点,我无法使用public function status()
{
return $this->hasMany(Log::class)
->orderBy('created_at', 'desc')->first();
}
函数。
在whereHas
模型上定义了surgery
关系:
Events
我尝试使用下面的代码,但是在此代码中,如果手术已确认但现在已取消,那么一旦确定手术后,也将返回与该手术相对应的事件。
public function surgery()
{
return $this->belongsTo(Surgery::class, 'surgery_id');
}
总而言之,我只需要获取与该事件相关的手术状态为CONFIRMED的事件。
答案 0 :(得分:0)
您可以简单地将HasMany
与HasOne
交换:
public function status()
{
return $this->hasOne(Log::class)
->orderBy('created_at', 'desc');
}
status
一词的问题是模棱两可。单数和复数相同,这使得很难确定我们是在谈论一个还是多个。因此,我可能会选择latestStatus()
和{{1}一起使用HasOne
和status()
来同时覆盖两者。
HasMany
答案 1 :(得分:0)
我用以下代码解决了它:
public function scopeConfirmedMaterials()
{
return $this->whereHas('surgery.latestStatus', function ($query){
$query->where('status_id', env('CONFIRMED'));
})->get()
->filter(function ($event){
return $event->surgery
->latestStatus
->status_id == env('CONFIRMED');
});
}
事件模型上的surgery
关系:
public function surgery()
{
return $this->belongsTo(Surgery::class);
}
关于手术模型的latestStatus
关系:
public function latestStatus()
{
return $this->hasOne(Log::class)
->orderBy('created_at', 'desc');
}
EventController
:
public function getEvent(){
return response()->json(
'data' => Events::confirmedMaterials();
);
}