Relasi Dinamis di Eloquent

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

Relasi Dinamis di Eloquent
Sveltekit Blogger

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.

Bagikan artikel ini ke