Laravel-запрос where для последней записи связанной таблицы - PullRequest
0 голосов
/ 02 декабря 2018

Я занимаюсь разработкой приложения Laravel.У меня проблема с запросом связанных двух таблиц с помощью предложения where.Это моя схема базы данных.

patients
========
id, name, email, password, created_at

treatments
==========
id, created_at, disease, note, patient_id

treatment_logs
=============
id, status, created_at, treatment_id

Моя схема базы данных очень проста.Теперь я хотел бы создать запрос, который извлекает обращения пользователя с последним статусом treatment_logs 1. Это мой запрос

class Patient extends Model {

    public function intensiveTreatments()
    {
        return $this->treatments()->whereHas('treatment_logs', function ($query) {
            $query->orderBy('id', 'desc')
                ->take(1)
                ->where('status', 1);
        });
    }

}

Проблема с этим запросом заключается в том, чтонезависимо от того, каков статус последней записи в журналах лечения.Пока есть treatment_logs со статусом 1, он будет возвращать записи.Но я хочу получить только записи с последними логами обращения, которые имеют статус 1. Как я могу получить их?

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Вы можете использовать JOIN:

public function intensiveTreatments()
{
    return $this->treatments()
        ->select('treatments.*')
        ->join('treatment_logs', 'treatments.id', 'treatment_logs.treatment_id')
        ->where('treatment_logs.status', 1)
        ->where('treatment_logs.id', function($query) {
            $query->select('id')
                ->from('treatment_logs')
                ->whereColumn('treatment_id', 'treatments.id')
                ->orderByDesc('id')
                ->limit(1);
        });
}

или интегрировать его в whereHas():

public function intensiveTreatments()
{
    return $this->treatments()->whereHas('treatment_logs', function ($query) {
        $query->where('status', 1)
            ->where('id', function ($query) {
                $query->select('id')
                    ->from('treatment_logs as latest')
                    ->whereColumn('latest.treatment_id', 'treatment_logs.treatment_id')
                    ->orderByDesc('id')
                    ->limit(1);
            });
    });
}
0 голосов
/ 02 декабря 2018

Добавить ->with('treatment_logs', function($query) { [... same clauses you use in whereHas...] }).Это происходит потому, что ваш запрос фильтрует обращения, а не журналы лечения.Поэтому, когда вы, например, делаете это:

$patient = Patient::with('intensiveTreatments')->get();

Вы действительно хотите загружать только процедуры, а не журналы процедур.Вот почему, когда вы позже получаете доступ к журналам лечения каждого лечения, они не фильтруются.

Дайте мне знать, если мне нужно объяснить лучше - моя терминология здесь не идеальна.

...