Я не уверен, является ли это хорошей идеей не ...
При нетерпеливой загрузке коллекций мы можем использовать помощники коллекции 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.