March 8, 2025 laravel
Cara Membuat Relasi First of Many di Laravel
Relasi first of many dapat digunakan untuk mengambil record pertama dari relasi has many. Di laravel 8.x kita dapat menambahkan relasi ini dengan 3 cara, yaitu:
latestOfMany
, mengambil record pertama dari has many berdasarkan id terbaruoldestOfMany
, mengambil record pertama dari has many berdasarkan id terlamaofMany
, mengambil record pertama dari has many dengan kondisi custom
Method di atas ditambahkan setelah hasOne
dari model yang ingin ditambahkan relasinya.
Contoh latestOfMany
untuk mengambil order terbaru dari user.
public function orders(): HasMany
{
return $this->hasMany(Order::class);
}
public function latestOrder(): HasOne
{
return $this->hasOne(Order::class)->latestOfMany();
}
Contoh oldestOfMany
untuk mengambil order terlama dari user.
public function orders(): HasMany
{
return $this->hasMany(Order::class);
}
public function oldestOrder(): HasOne
{
return $this->hasOne(Order::class)->oldestOfMany();
}
Contoh ofMany
untuk mengambil order dengan total harga tertinggi dari user.
Argumen pertama dari ofMany
diisi nama kolomnya (price), argumen kedua diisi fungsi untuk mengurutkan kolomnya (max, terbesar).
public function orders(): HasMany
{
return $this->hasMany(Order::class);
}
public function largestOrder(): HasOne
{
return $this->hasOne(Order::class)->ofMany('price', 'max');
}
ofMany
dapat digunakan untuk mengurutkan beberapa kolom sekaligus, caranya dengan menggunakan array (price tertinggi dan id terbaru).
public function orders(): HasMany
{
return $this->hasMany(Order::class);
}
public function largestOrder(): HasOne
{
return $this->hasOne(Order::class)->ofMany([
'price' => 'max',
'id' => 'max'
]);
}
ofMany
juga dapat ditambahkan query tambahan (price tertinggi, id terbaru, dan yang sudah valid).
public function orders(): HasMany
{
return $this->hasMany(Order::class);
}
public function largestOrder(): HasOne
{
return $this->hasOne(Order::class)->ofMany([
'price' => 'max',
'id' => 'max'
], function ($query) {
$query->whereNotNull('valid_at');
});
}
Di laravel 10.x syntaxHasOne
dapat diganti dengan memanggil relasi has many-nya kemudian ditambahkan method one
. Contoh.
public function orders(): HasMany
{
return $this->hasMany(Order::class);
}
public function largestOrder(): HasOne
{
return $this->orders()->one()->ofMany('price', 'max');
}
Baca lebih lengkap di https://laravel.com/docs/12.x/eloquent-relationships