Laravel жадная загрузка модельного аксессуара. Как мы можем sh решить, что будет загружено в приложение dry? - PullRequest
0 голосов
/ 20 июня 2020

Я не уверен, является ли это хорошей идеей не ...

При нетерпеливой загрузке коллекций мы можем использовать помощники коллекции Laravels (например, sum()) для достижения тех же результатов, что и в запросе builder.

Однако без первого вызова активной загрузки эти операции просто завершатся ошибкой, поскольку коллекция еще не существует.

Например:

// Отгрузка. php Модель

public function getTotalWeightGramsAttribute(): int
{
    return $this->shipmentPackages()->sum('weight_g');
}

Если мы вызываем blade {{ $shipment->total_weight_grams }} изнутри нашего представления лезвия, это всегда будет генерировать дополнительный запрос к базе данных.

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

// Отгрузка. php Модель

public function getTotalWeightGramsAttribute(): int
{
    if($this->relationLoaded('shipmentPackages')){
        return $this->fulfilmentPackages->sum('weight_g');
    }

    return $this->shipmentPackages()->sum('weight_g');
}

Однако добавление этой ответственности к модели, чтобы решить, будет ли ему нужно подсчитать fre sh количество из базы данных или использовать то, что находится в памяти, кажется опасным.

Например, я знаю, что при рендеринге представления я почти всегда могу загрузить это количество, но если мы являются используя его для каких-то вычислений в скрипте, мы, вероятно, захотим получить fre sh count.

Как мы можем переместить это решение за границу приложения, то есть контроллер, задание, класс действия и т. д. c.

...