запрос на связь, чтобы получить атрибут на основе максимального значения - PullRequest
0 голосов
/ 06 октября 2019

Я пытаюсь получить текущую стадию проекта со следующими отношениями.

У проекта есть много TaskGroup. TaskGroup имеют множество настроек. 'stage' является атрибутом модели 'Setting'.

Я пытаюсь получить максимальный идентификатор группы задач, которая назначена в проекте, и ее настройка будет иметь этап.

Этот код работает нормально, но этот запрос не оптимизирован.

//Project.php

public function getStepsAttribute()
{
    $id = $this->task_groups()->where('assigned',true)->max('id');

    if (is_null($id)){
        return 0;
    }

    return TaskGroup::find($id)->setting->step;

}

1 Ответ

0 голосов
/ 06 октября 2019

Вы можете использовать orderBy с first() и обернуть double optional здесь, чтобы гарантировать, что вы не получите property of undefined ошибок:

return optional(optional($this->task_groups()->where('assigned', true)->with('setting')->orderBy('id', 'desc')->first())->setting)->step;

Вы получите step, еслимодель существует, в противном случае null.

Это имеет 2 преимущества и 1 недостаток:

Преимущества

  1. Исключает дополнительный запрос
  2. Применяет энергичную загрузку для решения n..1

Недостатки

Боже мой, какой-то уродливый код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...