过滤具有特定状态的事件

时间:2019-06-04 15:32:38

标签: laravel relationship laravel-5.7

我正在尝试查询数据库以仅获取状态为'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的事件。

2 个答案:

答案 0 :(得分:0)

您可以简单地将HasManyHasOne交换:

public function status()
{
    return $this->hasOne(Log::class)
        ->orderBy('created_at', 'desc');
}

status一词的问题是模棱两可。单数和复数相同,这使得很难确定我们是在谈论一个还是多个。因此,我可能会选择latestStatus()和{{1}一起使用HasOnestatus()来同时覆盖两者。

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