Через hasOne(...)->latestOfMany() - один запис із багатьох, вибраний за правилом.
class User extends Model
{
public function latestOrder(): HasOne
{
return $this->hasOne(Order::class)->latestOfMany();
}
public function largestOrder(): HasOne
{
return $this->hasOne(Order::class)->ofMany('total', 'max');
}
}
$users = User::with('latestOrder')->get();
Чому не $user->orders()->latest()->first(): у циклі по користувачах це запит на кожного - N+1. А latestOfMany() - справжній зв'язок: його можна жадібно завантажити одним запитом для всіх користувачів, і Eloquent сам збудує підзапит з MAX(id) на кожного.
Що ще вміє:
oldestOfMany()- перший запис;- складніші правила: «найновіша опублікована ціна», де спершу береться максимум дати, а нічия розв'язується за id:
public function currentPricing(): HasOne
{
return $this->hasOne(Price::class)->ofMany(
['published_at' => 'max', 'id' => 'max'],
fn ($query) => $query->where('published_at', '<', now()),
);
}
Існує й перетворення готового hasMany: $this->orders()->one()->latestOfMany().