Cara Mutasi Eloquent Model Pada Laravel - CRUDPRO

Cara Mutasi Eloquent Model Pada Laravel

Cara Mutasi Eloquent Model Pada Laravel

Artikel ini akan menjelaskan berbagai cara untuk secara otomatis memanipulasi dan mengubah atribut model fasih saat mengakses atau mengambilnya.

Ada kalanya diperlukan untuk melakukan perhitungan atau menambahkan atribut tambahan berdasarkan atribut yang ada pada model fasih.

Contoh yang sangat baik dari hal ini dapat menggabungkan nama depan first_name dan nama belakang last_name pengguna untuk membentuk atribut baru yang dihitung bernama name yang tidak ada pada model kami sejak awal.

Contoh lain adalah menambahkan URL host/aplikasi yang mengarah ke file yang disimpan di database kami selama pengambilan.

Ada beberapa cara untuk mencapai ini, dan kami akan membahasnya bersama dengan kebiasaan mereka di artikel ini.


Menggunakan Accessor (Pengakses)

Accessor ini mungkin merupakan cara paling populer untuk mengubah atribut model. Laravel memungkinkan Anda untuk menentukan metode unik pada model Eloquent yang menjelaskan bagaimana Anda harus mengubah atribut selama pengambilan.

Contoh Kode

Ini adalah sintaks untuk menggunakan pengakses di Laravel:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Get the user's first name.
     *
     * @param  string  $value
     * @return string
     */
    public function getFirstNameAttribute($value)
    {
        return ucfirst($value);
    }
  
    /**
     * Get the user's phone number by combining the country code with the actual number.
     *
     * @return string
     */
    public function getPhoneNumberAttribute() 
    {
      return $this->country_code . $this->phone;  
    }
}

Kode di atas berisi dua pengakses. Model Pengguna memetakan ke tabel pengguna dengan kolom first_name, country_code, dan phone. Fungsi pertama mendefinisikan apa yang akan terjadi setiap kali $user→first_name dipanggil.

Fungsi kedua membuat atribut baru yang tidak ada di tabel pengguna. Setiap kali atribut phone_number diakses pada instance User, Eloquent akan menggabungkan kode negara dan telepon untuk membentuk nomor telepon.

Berikut adalah contoh pengakses yang digunakan dalam kode aktual:

<?php

namespace App\Http\Controllers\Employer\Dashboard;

use App\Http\Controllers\Controller;

use App\Models\User;

class HomeController extends Controller
{
  public function getUser($id) {
    $user = User::find($id);
    $user->first_name; // The accessor has to be "accessed" for the function to work.
    $user->phone_number; // This would create this property and do the concatenation.
    return response(['data' => $user], 200);
  }
}

Seperti yang terlihat pada contoh di atas, pengakses harus diakses agar dapat berfungsi. Jika mereka tidak diakses, maka itu harus mengembalikan objek standar yang disimpan dalam database.


Menggunakan Casting Atribut

Pemeran sangat mirip dengan pengakses. Mereka memungkinkan Anda melakukan jenis perubahan yang sama tetapi dengan gips, Anda tidak perlu menambahkan metode tambahan ke model Eloquent Anda.

Laravel Casts sendiri adalah topik yang sangat besar dan membutuhkan artikel terpisah untuk menjelaskan secara rinci. Anda dapat memeriksa dokumentasi resmi.

Biasanya, Cast digunakan untuk mengonversi atribut model Anda dari satu tipe data ke tipe data lainnya.

Untuk menggunakan ini, Anda harus mendefinisikan properti $casts (array) dalam model Anda dan menentukan atribut yang akan dilemparkan dan jenis yang harus digunakan.

Laravel menyediakan banyak tipe berguna yang dapat digunakan atribut Anda, dan mereka adalah:

  • array
  • boolean
  • collection
  • date
  • datetime
  • decimal:<digits>
  • double
  • encrypted
  • encrypted:array
  • encrypted:collection
  • encrypted:object
  • float
  • integer
  • object
  • real
  • string
  • timestamp
Contoh Kode

Berikut adalah contoh pemeran yang selalu memberikan atribut ke Boolean.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The attributes that should be cast.
     *
     * @var array
     */
    protected $casts = [
        'posts' => 'boolean',
    ];
}

Setelah kita mendefinisikan pemeran seperti ini, kita dapat mengakses nilainya seperti biasa, dan Eloquent akan mentransmisikannya ke tipe yang ditentukan.

<?php

namespace App\Http\Controllers\Employer\Dashboard;

use App\Http\Controllers\Controller;

use App\Models\User;

class HomeController extends Controller
{
  public function getUserPosts($id) {
    $user = User::find($id);
    $response = ['data' => $user];
    if($user->posts) {
      // Do something if user has posts 
    }
    return response($response, 200);
  }
}

Untuk mempelajari lebih lanjut tentang berbagai jenis gips serta cara membuat gips khusus Anda. Lihat pemeran dan pemeran khusus.

Menggunakan Acara Fasih

Ini adalah cara ketiga dan kurang dikenal untuk mengubah atribut model. Menggunakan pengakses itu luar biasa, tetapi mereka datang dengan batasan yang parah. Atribut apa pun yang perlu dimutasi harus terlebih dahulu "diakses" di sisi PHP. Ini menciptakan masalah ketika mendapatkan beberapa catatan, misalnya.

Menggunakan contoh pertama kami, jika kami ingin membuat semua pengguna tersedia di database kami, kirim mereka ke frontend, dan buat bidang kami bermutasi.

Kita harus membuat peta untuk mengakses properti terlebih dahulu sebelum mengirimnya ke frontend, dan ini merupakan biaya tambahan di server. Inilah cara kita melakukannya jika kita menggunakan gips atau pengakses:

Contoh Kode
<?php

namespace App\Http\Controllers\Employer\Dashboard;

use App\Http\Controllers\Controller;

use App\Models\User;

class HomeController extends Controller
{
  public function getUserPosts($id) {
    $users = User::all();
    $users->)->map(function ($user) {
      $user->first_name; // The accessor has to be "accessed" for the function to work.
      $user->phone_number; // This would create this property and do the concatenation.
    });
    return response(['data' => $users], 200);
  }
}

Sebelum membahas bagaimana peristiwa fasih membantu kita memecahkan masalah ini, mari kita bicara tentang apa itu.

Setiap contoh yang fasih memiliki siklus hidup.

Fasih memancarkan peristiwa yang berbeda sebagai tindakan yang berbeda dilakukan pada setiap model. Ini memancarkan peristiwa ketika tindakan lain terjadi dengan model. Ini adalah peristiwa yang tersedia yang dipancarkan fasih:

  • Retrieved
  • Creating
  • Created
  • Updating
  • Updated
  • Saving
  • Saved
  • Deleting
  • Deleted
  • Restoring
  • Restored
  • Replicating

Ini adalah tindakan berbeda yang dapat terjadi pada model yang fasih, dan untuk setiap peristiwa ini, kita dapat menulis pendengar acara yang membantu kita melihat peristiwa ini dan melakukan tindakan kapan pun salah satu dari ini terjadi.

Dari semua acara tersebut, yang menarik bagi kami adalah acara Retrieved. Eloquent mengaktifkan event ini setiap kali sebuah model diambil, dan kita dapat menghubungkan ke event ini dan mengubah record kita setelah diambil.

Ini berarti kita tidak perlu menulis accessor apapun, dan kita bisa memanipulasi record secara langsung di event listener.

Ada dua cara untuk menangani peristiwa ini. Yang pertama adalah menulis event listener untuk event ini. Yang kedua adalah menggunakan penutupan, dan kami akan menjelajahinya dalam contoh ini.

Untuk mencapai efek yang sama pada metode pertama, kami melakukan ini:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The booted method of the model
     *
     * Define all attributes here like normal code
     *
     * @param  string  $value
     * @return string
     */
    protected static function booted() {
      static::retrieved(function($user) {
        $user->first_name = ucfirst($user->first_name);
        $user->phone_number = $user->country_code . $user->phone;
        return $user;
      });
    }
}

Dengan menggunakan metode ini, kita tidak lagi harus “mengakses” metode sebelum dihitung. Kami menggunakannya seperti biasa, dan fungsi ini akan selalu dipanggil setiap kali model diambil.

<?php

namespace App\Http\Controllers\Employer\Dashboard;

use App\Http\Controllers\Controller;

use App\Models\User;

class HomeController extends Controller
{
  public function getUser($id) {
    $user = User::find($id);
    // Mutations would happen automatically
    return response(['data' => $user], 200);
  }
  
  public function getUsers() {
    $users = User::all();
    return response(['data' => $users], 200);
  }
}
Kesimpulan

Dalam artikel ini, kita mempelajari beberapa cara untuk mengubah atribut model fasih dan properti model fasih.

Saat membangun aplikasi skala menengah hingga besar, akan selalu ada skenario di mana kita membutuhkan perhitungan langsung seperti itu.

Seperti semua hal lain dalam pemrograman, jarang ada satu cara untuk melakukan sesuatu. Sebelum memilih salah satu dari ini, pertimbangkan kasus penggunaan Anda, trade-off, dan terus membangun hal-hal yang luar biasa.

Jika Anda merasa artikel ini bermanfaat, silakan share dengan mereka yang Anda rasa membutuhkannya dan beri tahu saya ya!