Last Updated on April 2, 2022 by
Bagi Anda yang sudah sering menggunakan laravel, pasti sudah tidak asing lagi dengan Eloquent. Namun apakah Anda sudah memanfaatkannya semaksimal mungkin?
Table of Contents
Pengertian Laravel Eloquent
Eloquent merupakan salah satu fitur yang dapat Anda manfaatkan untuk akses serta manipulasi data yang disimpan dalam manipulasi yang tersimpan dalam database dengan perintah yang lebih singkat serta mempercepat proses pembuatan CRUD dari database.
Eloquent pada Laravel memiliki fungsi-fungsi active record dan berbagai fungsi query sql dalam mengelola database. Dengan Eloquent, Anda juga dapat melakukan input data, edit, menampilkan, melakukan update serta membuat relasi tabel dengan sangat mudah. Eloquent juga dilengkapi berbagai fitur-fitur yang dapat membantu para developer.
Fitur-fitur yang ada pada Laravel Eloquent
- Bundles, merupakan fitur yang memiliki sistem pengemasan modular dan tersedia di beragam aplikasi.
- Eloquent ORM, adalah penerapan PHP lanjutan menyediakan metode internal dari pola active record untuk mengatasi permasalahan pada hubungan objek berbasis data.
- Reverse routing, untuk mendefinisikan relasi antar link dan route.
- Restfull Controllers, untuk memisahkan logika dalam melayani.
- Class auto loading, untuk menyediakan loading otomatis pada class PHP.
- Migration, fitur yang menyediakan sistem kontrol untuk database.
- Unit testing, untuk deteksi dan pencegahan regresi.
Pada artikel kali ini secara spesifik kami membahas kegunaan tips dan trik pada Eloquent ORM. Fitur ini mungkin terlihat seperti mekanisme yang sederhana bagi Anda.
Namun, dibalik kesederhanaannya, Laravel Eloquent ternyata menyimpan berbagai fungsi-fungsi lainnya yang tidak Anda ketahui. Ada beberapa cara untuk Anda dapat mendapatkan Laravel Eloquent ini. Berikut beberapa trik Laravel Eloquent untuk Anda.
Tips dan Trik Laravel Eloquent
1. Increments dan Decrements
Biasanya programmer menggunakan kode berikut ini untuk melakukan Increments dan Decrements.
$article = Article::find($article_id);
$article->read_count++;
$article->save();
Anda dapat membuatnya dengan:
$article = Article::find($article_id);
$article->increment('read_count');
Atau
Article::find($article_id)->increment('read_count');
Article::find($article_id)->increment('read_count', 10); // +10
Product::find($produce_id)->decrement('stock'); // -12.
2. Metode X or Y
Eloquent memiliki banyak fungsi yang menggabungkan dua metode, seperti perintah berikut ini
a. ‘findOFail()’
Biasanya developer menggunakan kode seperti ini:
$user = User::find($id);
if (!$user) { abort (404); }
Sebaiknya gunakan seperti ini:
$user = User::findOrFail($id);’
b. ‘firstOrCreate()’:
Biasanya developer menggunakan kode seperti ini:
$user = User::where('email', $email)->first();
if (!$user) {
User::create([
'email' => $email
]);
}
Sebaiknya gunakan seperti ini:
$user = User::firstOrCreate(['email' => $email]);
3. Metode Model Boot
Pada Laravel Eloquent terdapat tempat yang bersifat magis dikenal dengan ‘boot()’ pada Wloquent model. Contoh penggunaan ini secaea kode:
class User extends Model
{
public static function boot()
{
parent::boot();
static::updating(function($model)
{
// do some logging
// override some property like $model->something = transform($something);
});
}
}
Anda mungkin salah satu contoh paling populer adalah menyetel beberapa nilai bidang pada saat membuat objek model. Misalkan Anda ingin membuat bidang UUID pada saat itu.
public static function boot()
{
parent::boot();
self::creating(function ($model) {
$model->uuid = (string)Uuid::generate();
});
}
4. Hubungan antara kondisi dan ordering
Ini adalah kode yang umumnya dibuat untuk mendefinisikan hubungan dalam Eloquent.
public function users() {
return $this->hasMany('App\User');
}
Namun Anda juga dapat menambahkan where atau orderBy. Misal, jika ingin hubungan tertentu untuk beberapa jenis pengguna, juga diurutkan melalui email, Anda dapat melakukannya dengan perintah berikut ini:
public function approvedUsers() {
return $this->hasMany('App\User')->where('approved', 1)->orderBy('email');
}
5. Model Properties: timestamps, appends dan lainnya
Ada beberapa parameter dari sebuah model Eloquent dalam form dari suatu property dari kelas tersebut. Banyak orang membuatnya dengan berikut ini:
class User extends Model {
protected $table = 'users';
protected $fillable = ['email', 'password']; // which fields can be filled with User::create()
protected $dates = ['created_at', 'deleted_at']; // which fields will be Carbon-ized
protected $appends = ['field1', 'field2']; // additional values returned in JSON
}
Anda juga dapat membuatnya dengan:
protected $primaryKey = 'uuid'; // it doesn't have to be "id"
public $incrementing = false; // and it doesn't even have to be auto-incrementing!
protected $perPage = 25; // Yes, you can override pagination count PER MODEL (default 15)
const CREATED_AT = 'created_at';
const UPDATED_AT = 'updated_at'; // Yes, even those names can be overridden
public $timestamps = false; // or even not used at all
6. Anda dapat menemukan beberapa entri sekaligus
Kita semua tahu cara benar adalah ‘find()’ seperti pada kode berikut:
$user = User::find(1);
Namun kita dapat menemukan beberapa entri atau ID sekaligus dengan menggunakan array:
$users = User::find([1,2,3]);
7. WhereX
Anda dapat mengubah kode berikut ini:
$users = User::where('approved', 1)->get();
Menjadi seperti ini:
$users = User::whereApproved(1)->get();
Memang benar Anda dapat mengubah nama dari setiap bidang dan dapat menambahkannya sebagai akhiran “where”. Selain itu, terdapat beberapa metode yang ditentukan sebelumnya di Eloquent terkait dengan tanggal/waktu.
User::whereDate('created_at', date('Y-m-d'));
User::whereDay('created_at', date('d'));
User::whereMonth('created_at', date('m'));
User::whereYear('created_at', date('Y'));
8 Urutan berdasarkan hubungan
Trik ini adalah trik yang cukup kompleks. Trik ini digunakan jika Anda memiliki forum dengan berbagai topik namun ingin membuat urutan berdasarkan post terakhir. Persyaratan yang cukup umum di forum dengan topik yang terakhir diperbarui di atas. Pertama, jelaskan hubungan terpisah untuk postingan terbaru tentang topik tersebut:
fungsi publik latestPost ()
{
return $ this-> hasOne (\ App \ Post :: class) -> latest ();
}
Kemudian pada controller Anda dapat membuatnya menjadi:
$users = Topic::with('latestPost')->get()->sortByDesc('latestPost.created_at');
9. Eloquent::when() – no more if- else’s
Banyak orang membuat kueri kondisional dengan “if-else” sebagai berikut ini:
if (request('filter_by') == 'likes') {
$query->where('likes', '>', request('likes_amount', 0));
}
if (request('filter_by') == 'date') {
$query->orderBy('created_at', request('ordering_rule', 'desc'));
}
Ada cara yang lebih baik untuk menggunakan ‘when()’
$query = Author::query();
$query->when(request('filter_by') == 'likes', function ($q) {
return $q->where('likes', '>', request('likes_amount', 0));
});
$query->when(request('filter_by') == 'date', function ($q) {
return $q->orderBy('created_at', request('ordering_rule', 'desc'));
});
Anda juga dapat membuatnya seperti berikut ini jika dirasa kode dirasa terlalu panjang.
$query = User::query();
$query->when(request('role', false), function ($q, $role) {
return $q->where('role_id', $role);
});
$authors = $query->get();
10. Model Default dari BelongsTo
Hal ini berguna untuk Anda yang memiliki postingan milik penulis. Anda dapat menggunakan kode sebagai berikut:
{{ $post->author->name }}
Tapi bagaimana jika penulis dihapus, atau tidak disetel karena beberapa alasan? Anda akan mendapatkan error, seperti “property of non-object”. Anda dapat mencegahnya dengan:
{{ $post->author->name ?? '' }}
Anda juga dapat menbuatnya dalam tingkat hubungan Eloquent
public function author()
{
return $this->belongsTo('App\Author')->withDefault();
}
Pada contoh tersebut hubungan ‘author()’ akan kembali pada model kosong ‘App\Author’ jika penulis tidak melampirkannya pada post. Selanjutnya, kita dapat menetapkan nilai properti default ke model default tersebut.
public function author()
{
return $this->belongsTo('App\Author')->withDefault([
'name' => 'Guest Author'
]);
}
11. Mengurutkan dengan Mutator
Jika Anda memiliki kode seperti ini:
function getFullNameAttribute()
{
return $this->attributes['first_name'] . ' ' . $this->attributes['last_name'];
}
Namun ketika Anda ingin mengurutkan berdasarjan ‘full_name’ namun hal tersebut tidak berhasil. Anda dapat melakukannya dengan kode berikut:
$clients = Client::get()->sortBy('full_name'); // works!
12. Pengurutan dengan global scope
Jika Anda ingin memiliki ‘User::all()’ lalu Anda selalu melakukan pengurutan dengan bidang ‘name’ maka Anda dapat menggunakan global scope.
protected static function boot()
{
parent::boot();
// Order by name ASC
static::addGlobalScope('order', function (Builder $builder) {
$builder->orderBy('name', 'asc');
});
}
13. Metode Raw Query
Pada beberapa waktu kita perlu menambahkan raw queries pada pernyataan Eloquents. Berikut contohnya:
// whereRaw
$orders = DB::table('orders')
->whereRaw('price > IF(state = "TX", ?, 100)', [200])
->get();
// havingRaw
Product::groupBy('category_id')->havingRaw('COUNT(*) > 1')->get();
// orderByRaw
User::where('created_at', '>', '2016-01-01')
->orderByRaw('(updated_at - created_at) desc')
->get();
14. Teknik Replicate, membuat salinan dari suatu baris
Berikut adalah cara untuk membuat salinan dari entri database:
$task = Tasks::find(1);
$newTask = $task->replicate();
$newTask->save();
15. Chunk(), metode untuk tabel besar
Berikut terkait dengan Collection untuk memproses kumpulan data yang lebih besar, Anda dapat memecahnya menjadi beberapa bagian.
Jika biasanya menggunakan kode seperti ini:
$users = User::all();
foreach ($users as $user) {
// ...
Anda dapat menbuatnya seperti ini:
User::chunk(100, function ($users) {
foreach ($users as $user) {
// ...
}
});
16. Membuat hal tambahan saat membuat model
Artisan comman pada umumnya:
php artisan make:model Company
Ada tiga flag yang berguna untuk menghasilkan file terkait ke model.
php artisan make:model Company –mcr
penjelasan kode ini adalah:
a. -m akan membuat migrasi file (migration file)l.
b. –c akan membuayt sebuah controller.
c. –r akan mengindikasikan controller harus resourceful.
17. Mengesampingkan update_at ketika menyimpan
Metode ‘->save()’ dapat menerima parameter. Sebagai hasilnya Anda dapat memerintahkannya untuk mengabaikan ‘update_at’ yang secara default berfungsi untuk memenuhinya dengan timestamp terbaru.
$product = Product::find($id);
$product->updated_at = '2019-01-01 10:00:00';
$product->save(['timestamps' => false]);
18. Hasil dari ‘update()’
Kode ini dikembalikan dan menghasilkan affected row. Jawabannya adalah baris yang terpengaruh. Jadi jika Anda perlu memeriksa berapa banyak baris yang terpengaruh, Anda tidak perlu memanggil yang lain – metode update().
$result = $products->whereNull('category_id')->update(['category_id' => 2]);
19. Mengubah tanda kurung menjadi Eqoluent query
Anda dapat memiliki dan-atau mencampur dalam kueri SQL Anda, seperti ini:
... WHERE (gender = 'Male' and age >= 18) or (gender = 'Female' and age >= 65)
Cara yang salah saat melakukan translate pada Eloquent:
$q->where('gender', 'Male');
$q->orWhere('age', '>=', 18);
$q->where('gender', 'Female');
$q->orWhere('age', '>=', 65);
Maka urutannya akan salah. Urutan yang benar akan lebih kompleks dan Anda akan mendapatkan:
$q->where(function ($query) {
$query->where('gender', 'Male')
->where('age', '>=', 18);
})->orWhere(function($query) {
$query->where('gender', 'Female')
->where('age', '>=', 65);
})
20. orWhere denan parameter ganda
Anda dapat melewati array dari parameters yaitu ‘orWhere()’ yang mana umumnya seperti ini:
$q->where('a', 1);
$q->orWhere('b', 2);
$q->orWhere('c', 3);
Anda dapat membuatnya seperti ini:
$q->where('a', 1);
$q->orWhere(['b' => 2, 'c' => 3]);
Demikianlah tips dan trik Laravel Eloquent yang dapat memudahkan Anda saat menggunakan Laravel. Selamat mencoba.
Jangan lupa kunjungi Web App di https://appkey.id/ atau download aplikasinya di Google Play Store agar Anda tidak ketinggalan informasi terbaru.
Jasa Pembuatan Aplikasi, Website dan Internet Marketing | PT APPKEY
PT APPKEY adalah perusahaan IT yang khusus membuat aplikasi Android, iOS dan mengembangkan sistem website. Kami juga memiliki pengetahuan dan wawasan dalam menjalankan pemasaran online sehingga diharapkan dapat membantu menyelesaikan permasalahan Anda.