Our blog

Filter "Eloquent relationships" secara "on-the-fly" saat kita membutuhkannya

 

Latest Blog's

Filter "Eloquent relationships" secara "on-the-fly" saat kita membutuhkannya

Laravel     2 weeks ago


Saya menemukan banyak fitur "Eloquent" pada laravel yang semakin jarang dipakai, mungkin kurang terkespose. Padalah fitur2 tersebut banyak yang sangat membantu pekerjaan kita.

Dibawah ini saya buat contoh sederhana relasi pada laravel:

class Author extends Model 
{
  public function books()
  {
    return $this->hasMany(Book::class);
  }
}

Lalu lanjut ke Controller:

$authors = Author::all();
foreach ($authors as $author) {
  foreach ($author->books as $book) {
  // .. do something
  }
}

Tetapi bagaimana jika kamu ingin mengapaptkan hanya buku yang di tulis di tahun ini? Jawaban umum pasti kalian akan merubah relasi menjadi seperti ini:

public function books()
{
   return $this->hasMany(Book::class)->whereYear('books.created_at', date('Y'));
}

Catatan: Untuk materi whereYear bisa dibaca disini

Pilihan lain dengan cara memisahkan fungsi relasi seperti ini:

public function books()
{
    return $this->hasMany(Book::class);
}
 
public function booksThisYear()
{
    return $this->hasMany(Book::class)->whereYear('books.created_at', date('Y'));
}

Lalu load seperti ini:

foreach ($author->booksThisYear() as $book) ...

Tapi ada cara yang lebih fleksibel, kalian bisa mencobanya seperti ini:

$authors = Author::with(['books' => function($query) {
  $query->whereYear('created_at', date('Y'));
}])->get();

Dengan cara diatas, kalian gak perlu merubah relasi. Dan kalian dapat melakukan filter hanya dibagian yang ingin dilakukan filter.

Cara lain, sebagai contoh jika kalian ingin tahun dibuat sebagai variabel:

$year = 2018; // Feels weird writing it on January 2, still getting used to 2018
$authors = Author::with(['books' => function($query) {
  $query->whereYear('created_at', $year);
}])->get();

Cara diatas akan mengakibatkan error dan variabel $year dianggap tidak valid.
Berikut cara yang benar:

$year = 2018; 
$authors = Author::with(['books' => function($query) use ($year) {
  $query->whereYear('created_at', $year);
}])->get();

OK, simpel kan? Semoga bermanfaat.