Laravel adalah sumber terbuka dan mudah digunakan kerangka PHP. Salah satu fiturnya yang paling canggih adalah Eloquent, sebuah object-relational mapper (ORM) yang menyederhanakan penanganan catatan database.

Kecepatan luar biasa dalam membuat, membaca, memperbarui, dan menghapus operasi pada database dari suatu aplikasi. Saat menggunakan Eloquent, Anda membuat model yang mencerminkan tabel database dan menggunakan model tersebut untuk membuat kueri Anda.

Artikel ini membahas enam elemen fungsionalitas Eloquent yang paling ampuh: cakupan kueri, hubungan, mutator dan pengakses, koleksi, penghapusan model, dan pabrik. Ini mencakup apa yang dilakukan setiap fitur menggunakan contoh-contoh praktis. Kami harap Anda dapat menggunakan contoh-contoh ini untuk meningkatkan penguasaan Anda Laravel Fasih.

1. Cakupan kueri yang fasih

Saat membuat aplikasi, terkadang Anda menghadapi situasi di mana Anda menggunakan kondisi lebih dari sekali. Menulis ulang kode dalam setiap kasus dapat meningkatkan kemungkinan kesalahan dan membuat kode Anda tidak rapi. Laravel memecahkan masalah ini dengan membungkus kondisi tersebut dalam pernyataan yang dapat digunakan kembali yang disebut cakupan.

Cakupan kueri adalah metode untuk menambahkan logika database ke model dan menggunakan kembali logika kueri.

Di bawah ini adalah contoh cakupan kueri. Asumsikan Anda ingin membuat platform pengembangan perangkat lunak untuk tim Anda yang melacak fitur yang sudah selesai dan sedang berjalan. Anda dapat menggunakan ketentuan ini untuk mengambil fitur yang sedang berjalan saja:

$onGoing = Project::where('ongoing', 1)->get();

Anda mungkin memerlukan kondisi ini di halaman aplikasi lain, seperti halaman statistik. Cakupan kueri memungkinkan laman menggunakan kembali kondisi di atas, menyederhanakan kueri, dan membuat kode Anda lebih bersih.

Berikut cara menggunakan cakupan kueri untuk skenario ini:

class Features extends Model
{
    public function scopeOngoing($query)
    {
        return $query->where('ongoing', 0);
    }
}

Kemudian gunakan kode di bawah ini untuk mengeksekusi cakupan tersebut:

$onGoing = Feature::ongoing()->get();

Ada dua jenis cakupan: global dan lokal.

Cakupan global

Cakupan global memungkinkan penambahan batasan pada semua kueri dalam model. Misalnya, Anda dapat menambahkan ketentuan untuk memfilter fitur berdasarkan nama ketua tim di semua kueri dalam model Anda.

Cakupan lokal

Cakupan lokal memungkinkan definisi batasan umum untuk dapat digunakan kembali. Misalnya, Anda mungkin ingin aplikasi mengembalikan fitur yang memiliki bug. Kode Anda mungkin menerapkan cakupan lokal seperti ini:

namespace AppModels;
use IlluminateDatabaseEloquentModel;

class User extends Model
{
    public function scopeBugged($query)
    {
        return $query->where('bugged', '>', 1);
    }
}

Kode di atas mengembalikan semua fitur yang bugnya belum diperbaiki.

2. Hubungan yang fasih

Hubungan di Eloquent memungkinkan Anda menghubungkan tabel yang berbeda dengan mudah. Misalnya, produk di situs web e-niaga mungkin memiliki inventaris, harga, tampilan, dan ulasan. Dengan Eloquent, Anda dapat dengan mudah mengelola hubungan ini bahkan ketika rekamannya berada di tabel yang berbeda.

Anda dapat mendefinisikan hubungan sebagai metode pada kelas model, seperti yang Anda lakukan pada model Eloquent. Beberapa hubungan Eloquent yang umum digunakan meliputi hubungan satu-ke-satu, invers, dan polimorfik.

Satu lawan satu

Berikut ini contoh hubungan dasar satu-ke-satu yang mengaitkan model produk dengan inventaris.

public function Inventory()
{
    return $this->hasOne('AppInventory');
}

Pada kode di atas, Inventory() metode memanggil hasOne() metode pada model produk. Ini memeriksa apakah produk saat ini tersedia.

Terbalik

Fasih juga memungkinkan Anda menciptakan hubungan terbalik. Misalnya, ketika Anda ingin mengambil produk berdasarkan jumlah penayangannya. Hubungan terbalik dapat memberi Anda produk yang paling menarik minat pengunjung situs web. Anda dapat menggunakan belongsTo() metode, yang merupakan kebalikan dari hasOne(). Kode di bawah menggambarkan hal ini.

public function product()
{
    return $this->belongsTo('AppProduct');
}

Pada kode di atas, Eloquent cocok dengan product_id dengan jumlah penayangan yang dilewati. Itu product_id kemudian dapat membantu mengambil parameter lain, seperti harga dan inventaris.

Polimorfik

Dalam pengembangan aplikasi, hubungan tidak selalu sederhana. Terkadang, Anda memiliki model yang dimiliki lebih dari satu jenis model. Misalnya, model produk dan inventaris keduanya dapat memiliki hubungan polimorfik dengan model gambar.

Hubungan polimorfik akan memungkinkan Anda menggunakan daftar gambar yang sama untuk inventaris dan produk. Di bawah ini cuplikan kode yang mengimplementasikan hubungan polimorfik.

class Image extends Model
{
    /**
     * Getting the shared image.
     */
    public function myimage()
    {
        return $this->morphTo();
    }
}

class Product extends Model
{
    /**
     * Get the image to use on the product's page.
     */
    public function image()
    {
        return $this->morphOne(Image::class, 'myimage');
    }
}

class Inventory extends Model
{
    /**
     * Get the image to use on the inventory page.
     */
    public function image()
    {
        return $this->morphOne(Image::class, 'myimage');
    }
}

Kode di atas menggunakan morphTo() metode untuk mengambil induk dari model polimorfik.

Itu hanyalah puncak gunung es dalam topik ini. Untuk lebih lanjut, lihat panduan lanjutan kami untuk Hubungan Laravel yang fasih.

3. Mutator dan pengakses yang fasih

Mutator dan pengakses memungkinkan Anda mengubah data saat menyimpan dan mengambilnya. Mutator memodifikasi data sebelum menyimpannya, sementara pengakses memodifikasi data saat mengambilnya.

Jika Anda ingin menyimpan nama dalam huruf kecil di database Anda, Anda bisa membuat mutator untuk menjalankan transformasi tersebut. Jika Anda ingin menampilkan nama depan dan nama belakang pengguna sebagai satu nama di halaman aplikasi, Anda bisa membuat pengakses untuk melakukannya.

Di bawah ini adalah contoh mutator yang menggunakan huruf besar pada nama sebelum menyimpannya.

class User extends Model
{
    /**
     * Mutators capitalizing first and last name.
     */
    public function setFirstNameAttribute($value)
    {
        $this->attributes['first_name'] = ucfirst($value);
    }

    public function setLastNameAttribute($value)
    {
        $this->attributes['last_name'] = ucfirst($value);
    }
}

Di bawah ini adalah contoh pengakses yang menggabungkan nama depan dan nama belakang pengguna.

class User extends Model
{
    /**
     * Accessor combining both names.
     */
    public function getFullNameAttribute()
    {
        return ucfirst($this->first_name) . ' ' . ucfirst($this->last_name);
    }
}

4. Koleksi yang fasih

Koleksi yang fasih menangani metode yang mengembalikan beberapa hasil model. Kelas ini ditemukan di IlluminateDatabaseEloquentCollection.

Seperti halnya array, iterasi melalui koleksi dapat dilakukan. Di bawah ini adalah iterasi sederhana.

use AppModelsProduct;

$products = Product::where('availability', 1)->get();

foreach ($products as $product) {
   echo $product->name;
}

Koleksi lebih kuat daripada array karena Anda dapat melakukan operasi yang lebih kompleks pada koleksi tersebut. Misalnya, Anda dapat menampilkan daftar semua produk yang tersedia dan melewatkan semua produk yang tidak “aktif”.

$names = Product::all()->reject(function ($product) {
   return $product->active === false;
})->map(function ($product) {
   return $product->name;
});

Berikut adalah beberapa metode yang disediakan oleh kelas koleksi.

Mengandung

Itu contains() metode memeriksa apakah kode berisi mode tertentu, seperti yang ditunjukkan pada kode di bawah ini:

$products->contains(1);
$products->contains(Product::find(1));

Semua

Itu all() metode mengembalikan model yang terdapat dalam koleksi, seperti yang ditunjukkan di bawah ini:

$collection = Product::all();

Banyak metode lain yang didukung oleh kelas koleksi.

5. Hapus model Eloquent

Di Eloquent, Anda membuat model untuk membantu membuat kueri. Namun, terkadang Anda perlu menghapus model untuk membuat aplikasi lebih efisien. Untuk melakukannya, teleponlah delete pada contoh model.

use AppModelsStock;

$stock = Stock::find(1);
$stock->delete();

Kode di atas menghapus model Stock dari sebuah aplikasi. Ini adalah penghapusan permanen yang tidak dapat dibatalkan.

Hapus sementara

Fitur lain yang dikandung Eloquent adalah kemampuan penghapusan lunak model. Saat Anda menghapus sementara suatu model, Anda tidak menghapusnya dari database.

Anda menandainya menggunakan deleted_at untuk menunjukkan waktu dan tanggal penghapusan sementara. Hal ini penting ketika Anda ingin mengecualikan sebagian rekaman database, misalnya rekaman yang tidak lengkap, tanpa menghapusnya secara permanen. Ini membantu dalam membersihkan hasil kueri Eloquent tanpa menambahkan ketentuan tambahan.

Anda mengaktifkan penghapusan sementara dengan menambahkan softDeletes sifat pada model dan menambahkan a deleted_at kolom pada tabel database terkait.

Menambahkan penghapusan sementara ke model

Anda mengaktifkan penghapusan sementara model dengan menambahkan IlluminateDatabaseEloquentSoftDeletes sifat, seperti yang ditunjukkan di bawah ini.

namespace AppModels;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentSoftDeletes;

class Flight extends Model
{
   use SoftDeletes;
}

Bagaimana cara menambahkan kolom delete_at

Sebelum Anda dapat mulai menggunakan penghapusan sementara, database Anda harus memiliki a delete_at kolom. Anda menambahkan kolom ini menggunakan Laravel Schema metode pembantu pembangun, seperti yang ditunjukkan di bawah ini:

use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;

Schema::table('users', function (Blueprint $table) {
   $table->softDeletes();
});

Schema::table('users', function (Blueprint $table) {
   $table->dropSoftDeletes();
});

Ini menambahkan a delete_at kolom yang diperbarui dengan tanggal dan waktu, jika tindakan penghapusan sementara berhasil.

Cara memasukkan model yang dihapus sementara

Jika Anda ingin hasil kueri menyertakan model yang dihapus sementara, tambahkan withTrashed() metode ke kueri. Contohnya ditunjukkan di bawah ini:

$stocks = Stock::withTrashed()->where('stock_id', 20)->get();

Kueri di atas juga akan menyertakan model dengan deleted_at atribut.

Cara mengambil hanya model yang dihapus sementara

Eloquent juga memungkinkan Anda mengambil model yang dihapus sementara secara eksklusif. Anda dapat melakukannya dengan menelepon onlyTrashed() metode, misalnya:

$Stock = Stock::onlyTrashed()->where('stock_id', 1)->get();

Cara mengembalikan model yang terhapus sementara

Anda juga dapat memulihkan model yang terhapus sementara dengan memanggil restore() metode.

$stocks = Stock::withTrashed()->where('stock_id', 20)->restore();

Ini mengubah delete_at bidang model yang dihapus sementara menjadi nol. Jika model belum dihapus sementara, bidangnya tidak berubah.

6. Pabrik yang Fasih

Pabrik model di Laravel membuat data dummy yang dapat Anda gunakan untuk menguji aplikasi Anda atau untuk menyemai database Anda. Untuk mengimplementasikannya, Anda membuat model di kelas pabrik, seperti yang ditunjukkan pada contoh di bawah. Cuplikan kode membuat pabrik model yang dapat menghasilkan pemasok palsu untuk suatu produk dan harganya.

namespace DatabaseFactories;
use IlluminateDatabaseEloquentFactoriesFactory;
use IlluminateSupportStr;

class StockFactory extends Factory
{
    public function definition()
    {
        return [
            'supplier_name' => fake()->name(),
            'price' => fake()->numberBetween($min = 1500, $max = 6000),
        ];
    }
}

Itu definition() metode dalam contoh di atas mengembalikan sekumpulan nilai atribut yang digunakan Laravel saat membangun model. Pembantu palsu membantu pabrik mengakses perpustakaan PHP, Pemalsu.

Ringkasan

Eloquent membuat tugas pengembangan aplikasi di Laravel menjadi lebih sederhana. Ini sama efektifnya ketika membuat kueri sederhana atau kompleks, berkat implementasi seperti hubungan. Kesederhanaan dalam menghasilkan data dummy fungsional menggunakan pabrik menjadikannya sempurna bagi pengembang yang ingin membuat pengujian yang kuat untuk aplikasi mereka. Selain itu, cakupan Eloquent membantu menyederhanakan kueri kompleks dengan cara yang membuat kode tetap rapi.

Meskipun artikel ini hanya membahas enam fitur utamanya, Eloquent memiliki fungsi canggih lainnya. Penggunaan model yang dapat dibagikan dan digunakan kembali telah menjadikan Eloquent fitur yang populer di kalangan pengembang, dan kesederhanaan kueri Eloquent menjadikan Laravel kerangka kerja yang ramah pengembang — bahkan untuk pemula.

Apapun tingkat pengalaman Anda, Kinsta’s Hosting Aplikasi Web platform mendukung pengembang seperti Anda. Kita Templat mulai cepat Laravel menunjukkan betapa mudahnya mengaktifkan dan menjalankan aplikasi Anda di server kami dalam Google Cloud jaringan tingkat premium.

Steve Bonisteel
Kinsta

Steve Bonisteel adalah Editor Teknis di Kinsta yang memulai karir menulisnya sebagai jurnalis cetak, mengejar ambulans dan truk pemadam kebakaran. Dia telah meliput teknologi terkait Internet sejak akhir tahun 1990an.