
Laravel latestOfMany(): отримайте останній пов'язаний запис як relationship
Замість завантаження всієї колекції пов'язаних моделей і пошуку останнього запису опишіть окремий relationship через latestOfMany().
Якщо модель має багато пов'язаних записів, але в коді постійно потрібний лише один останній, не обов'язково щоразу завантажувати всю колекцію і шукати потрібний запис у PHP.
Eloquent дозволяє описати це правило як окремий relationship через latestOfMany().
Замість завантаження всієї колекції
$order = $user->orders ->sortByDesc('id') ->first();public function latestOrder(): HasOne{ return $this ->hasOne(Order::class) ->latestOfMany();}У першому варіанті звернення до $user->orders завантажує колекцію пов'язаних замовлень, після чого PHP сортує її і залишає лише один запис.
Якщо бізнесу потрібне саме останнє замовлення, краще описати це безпосередньо в моделі як latestOrder().
Використання стає звичайним relationship
$user = User::query() ->with('latestOrder') ->findOrFail($userId); $order = $user->latestOrder;latestOrder тепер можна використовувати так само, як будь-який інший relationship: звертатися до нього як до властивості, попередньо завантажувати через with() і використовувати в інших Eloquent-запитах.
При цьому не потрібно завантажувати всі замовлення лише для того, щоб залишити одне.
Якщо orders() уже існує, його можна використати повторно
public function orders(): HasMany{ return $this->hasMany(Order::class);} public function latestOrder(): HasOne{ return $this ->orders() ->one() ->latestOfMany();}Не обов'язково повторювати визначення зв'язку. Якщо orders() уже повертає HasMany, його можна перетворити на зв'язок з одним записом через one() і додати latestOfMany().
Що означає latest за замовчуванням
Якщо у вашій моделі зростаючий числовий id відповідає потрібному правилу, latestOfMany() добре передає цей намір.
Але якщо поняття "останній" у предметній області визначається конкретною датою, це правило краще записати явно.
Для останнього за датою використовуйте ofMany()
public function latestOrder(): HasOne{ return $this ->hasOne(Order::class) ->ofMany('created_at', 'max');}Так relationship прямо говорить, що потрібний запис з найбільшим created_at. Це краще, ніж покладатися на припущення, що найбільший id завжди означає найновіший запис за бізнес-правилом.
Якщо з набору пов'язаних моделей вам постійно потрібний лише один останній запис, опишіть це як relationship. latestOfMany() переносить вибір потрібного запису на рівень запиту і не змушує завантажувати всю колекцію лише заради одного результату.




