laravel-latestofmany-latest-related-record-tip.png
Шаблон кодуLaravel

Laravel latestOfMany(): отримайте останній пов'язаний запис як relationship

Замість завантаження всієї колекції пов'язаних моделей і пошуку останнього запису опишіть окремий relationship через latestOfMany().

Якщо модель має багато пов'язаних записів, але в коді постійно потрібний лише один останній, не обов'язково щоразу завантажувати всю колекцію і шукати потрібний запис у PHP.

Eloquent дозволяє описати це правило як окремий relationship через latestOfMany().

До
php
$order = $user->orders    ->sortByDesc('id')    ->first();
Після
php
public function latestOrder(): HasOne{    return $this        ->hasOne(Order::class)        ->latestOfMany();}

У першому варіанті звернення до $user->orders завантажує колекцію пов'язаних замовлень, після чого PHP сортує її і залишає лише один запис.

Якщо бізнесу потрібне саме останнє замовлення, краще описати це безпосередньо в моделі як latestOrder().

Використання стає звичайним relationship

PHP - Попередньо завантажити latestOrder
$user = User::query()    ->with('latestOrder')    ->findOrFail($userId); $order = $user->latestOrder;

latestOrder тепер можна використовувати так само, як будь-який інший relationship: звертатися до нього як до властивості, попередньо завантажувати через with() і використовувати в інших Eloquent-запитах.

При цьому не потрібно завантажувати всі замовлення лише для того, щоб залишити одне.

Якщо orders() уже існує, його можна використати повторно

PHP - Перетворити HasMany на HasOne of Many
public function orders(): HasMany{    return $this->hasMany(Order::class);} public function latestOrder(): HasOne{    return $this        ->orders()        ->one()        ->latestOfMany();}

Не обов'язково повторювати визначення зв'язку. Якщо orders() уже повертає HasMany, його можна перетворити на зв'язок з одним записом через one() і додати latestOfMany().

Що означає latest за замовчуванням

latestOfMany() за замовчуванням вибирає останній запис за sortable primary key. Це не обов'язково те саме, що найновіший запис за created_at.

Якщо у вашій моделі зростаючий числовий id відповідає потрібному правилу, latestOfMany() добре передає цей намір.

Але якщо поняття "останній" у предметній області визначається конкретною датою, це правило краще записати явно.

Для останнього за датою використовуйте ofMany()

PHP - Останній запис за created_at
public function latestOrder(): HasOne{    return $this        ->hasOne(Order::class)        ->ofMany('created_at', 'max');}

Так relationship прямо говорить, що потрібний запис з найбільшим created_at. Це краще, ніж покладатися на припущення, що найбільший id завжди означає найновіший запис за бізнес-правилом.

Якщо з набору пов'язаних моделей вам постійно потрібний лише один останній запис, опишіть це як relationship. latestOfMany() переносить вибір потрібного запису на рівень запиту і не змушує завантажувати всю колекцію лише заради одного результату.

#eloquent #laravel-12 #laravel-13 #eager-loading #relationships #latest-of-many #one-of-many

Схожі поради

laravel-withwherehas-avoid-duplicate-conditions-tip.pngПорада
Переглянути пораду
#eloquent #laravel-12 #laravel-13 #php-8-4 #php-8-5 #where-has #with-where-has #eager-loading #relationships
laravel-tap-side-effects-keep-original-value-tip.pngПорада
Переглянути пораду
#eloquent #laravel-12 #laravel-13 #php-8-4 #php-8-5 #tap #helpers #tappable
laravel-firstorcreate-replace-first-create-tip.pngПорада
Переглянути пораду
#eloquent #laravel-12 #laravel-13 #php-8-4 #php-8-5 #model-persistence #first-or-create #first-or-new
laravel-updateorcreate-replace-first-if-tip.pngПорада
Переглянути пораду
#eloquent #laravel-12 #laravel-13 #php-8-4 #php-8-5 #update-or-create #model-persistence #upsert