Фильтр событий, который имеет определенный статус - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь запросить в своей базе данных выборку только тех строк, которые имеют статус «ПОДТВЕРЖДЕНО», но статус сохраняется в таблице журнала, а не в событиях, где мне нужно выполнить запрос. В таблице logs хранится все состояние операции, а текущее состояние операции с идентификатором 1 - это последняя строка, вставленная с surgery_id 1. Как получить все события, операция которых имеет статус CONFIRMED?

Это моя структура базы данных:

 Surgery           Events              Log
    id               id                id
patient_id       surgery_id         surgery_id
                                    status_id

Я использую laravel v5.7.28 с базой данных postgresql.

Вкл. 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');
}

Я пытался использовать приведенный ниже код, но с этим, если операция была ПОДТВЕРЖДЕНА, но теперь ОТМЕНЕНА, событие, соответствующее этой операции, также будет возвращено, как только эта операция уже будет когда-либо подтверждена.

Events::whereHas('surgery.status', function ($query){
    $query->where('status_id', env('CONFIRMED'));
})->get();

Подводя итог, мне нужно выбрать только те события, когда операция, связанная с этим событием, имеет статус ПОДТВЕРЖДЕННЫЙ.

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Я решил это с помощью следующего кода:

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();
    );
}
0 голосов
/ 04 июня 2019

Вы можете просто поменять HasMany на HasOne:

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

Проблема со словом status в том, что это неоднозначно.Это одинаково для единственного и множественного числа, что затрудняет определение того, говорим ли мы об одном или нескольких.Так что я бы, наверное, пошел на latestStatus() с HasOne и на status() с HasMany, чтобы покрыть оба.

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

public function latestStatus()
{
    return $this->hasOne(Log::class)
        ->orderBy('created_at', 'desc');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...