Relasi Dinamis di Eloquent
Relasi dinamis yang tidak ada di database, untuk meningkatkan performa query tanpa menggunakan relasi hasMany di aplikasi Laravel.

Qisthi Ramadhani / 04 Desember 2022
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function lastLogin(): BelongsTo
{
return $this->belongsTo(Login::class);
}
/**
* @param \Illuminate\Database\Eloquent\Builder $query
* @return void
*/
public function scopeWithLastLogin(Builder $query)
{
$query->addSelect(['last_login_id' => Login::query()
->select('id')
->whereColumn('user_id', 'users.id')
->latest()
->take(1)
])->with('lastLogin');
}
Penggunaan
$users = User::query()->withLastLogin()->orderBy('name')->paginate();
Relasi dinamis ini sangat cocok untuk kita yang ingin menghindari relasi hasMany
(berakibat query yang banyak) di kode kita.
Yang dinamis disini ialah kolom last_login_id
, di schema
database kita kolom tersebut tidak ada, tetapi melakukan sub-query untuk mengambil 1 data terakhir dari tabel logins
. Kemudian, di dalam scopeWithLastLogin
kita eager load
-kan dengan relasi seolah-olah laravel tau bahwa kolom last_login_id
tersebut ada di tabel users
.