Sử dụng Eloquent ORM

Sử dụng Eloquent ORM là bài viết hướng dẫn tương tác với database từ Laravel bằng cách dùng thư viện tích hợp sẵn : Eloquent

Giới thiệu Eloquent ORM

Eloquent ORM là công cụ trong Laravel cung cấp cách thức tương tác với database rất thuận lợi. Việc sử dụng Eloquent ORM rất đơn giản, dễ dàng.

Với Eloquent, mỗi table trong database sẽ có một model tương ứng. Model này giúp select, insert, update, delete dữ liệu trong table rất dễ dàng.

Việc tạo Model trong Laravel rất đơn giản, thực hiện bằng công cụ artisan. Khi tạo xong, mỗi model là 1 file lưu trong folder app/Models

Tạo model với Eloquent

Để tạo model với Eloquent, sử dụng lệnh sau:

php artisan make:model Nhasanxuat

Sau khi chạy lệnh xong, vào folder app/Models sẽ thấy model mới được tạo.

Các mặc định trong Eloquent model

Để sử dụng Eloquent ORM, bạn cần biết cách khai báo một số biến đặc biệt sau đây trong model:

1. $table: Là biến để khai báo tên table liên kết với model hiện tại. Mặc định Laravel sẽ cho mỗi model map với một table có tên giống model nhưng có thêm s hoặc ies. Ví dụ model Product sẽ map với table products, model tin map với table tins. Để bỏ mặc định thì dùng biến $table như hình dưới.

2. $primaryKey: Là biến để cho biết field nào là khóa chính trong table. Mặc định, model xem field có tên id là khóa chính. Nếu Bạn dùng khóa chính là tên khác thì khai báo trong biến $primaryKey nhé. Ngoài ra nếu khóa chính không phải là số thì cần thiết lập biến $incrementing = false.

3. $timestamps : Là biến dùng để cho hay cấm Eloquent ghi nhận thời điểm tạo/ cập nhật các record. Nếu Bạn cho ghi thì khai báo $timestamps = true , khi đó trong table phải có 2 field created_at , updated_at. Còn nếu không muốn ghi thời điểm thì gán $timestamps = false

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Nhasanxuat extends Model {
   protected $table = 'nhasanxuat';
   public $primaryKey = 'maNSX';
   public $incrementing = false;
   public $timestamps = false;
   protected $attributes = [
      'logo' => '',
      'status' => 0
   ];
}

4. $attributes: Là biến dùng để khai báo giá trị mặc định cho các field trong table , dùng khi insert, update

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Nhasanxuat extends Model {
    protected $table = 'nhasanxuat';
    public $primaryKey = 'maNSX';
    public $incrementing = false;
    public $timestamps = false;
    protected $attributes = [
        'logo' => '',
        'status' => 0
    ];
}

5. $fillable : Là biến dùng để khai báo các field trong table

6. $dates: là biến dùng để khai báo các field kiểu ngày trong table.

class tin extends Model {
protected $table='tin';
protected $primaryKey='id';
protected $dates = ['ngayDang'];
protected $fillable = [
   'tieuDe','tomTat','urlHinh','ngayDang','noiDung','idLT'
];
}

Tương tác db với Eloquent model

Đến đây thì bạn đã biết cách tạo tạo model và khai báo các thuộc tính cần thiết cho nó. Giờ thì Bạn đã có thể sử dụng Eloquent ORM để xem thêm sửa xóa dữ liệu trong table. Bắt đầu nhé:

Lấy data với Eloquent model

– Khi cần lấy tất cả record từ table, dùng phương thức all()

$kq = App\Models\Nhasanxuat::all();
foreach ($kq as $nsx) {
    echo $nsx->ten,"<br>";
}

– Lấy các record theo điều kiện, dùng phương thức get() như trong query buider

$kq = App\Models\Nhasanxuat::where('status', 1)->orderBy('ten')->get();
foreach ($kq as $nsx) echo $nsx->ten,"<br>";

– Để lấy một record từ table, Bạn dùng phương thức find()

$kq = App\Models\Nhasanxuat::find(10);//lấy record có id là 10
echo $kq->ten;

– Còn khi cần lấy record đầu tiên, bạn dùng phương thức first() hoặc firstWhere()

$kq=App\Models\Nhasanxuat::where('status',1)->first();
echo $kq->ten, "<br>";
$kq = App\Models\Nhasanxuat::firstWhere('status',1);
echo $kq->ten, "<br>";

Lấy thông tin tổng kết

Có thể dùng các phương thức sum(), max(), min(), count() để có các thông tin tổng kết

$count=Nhasanxuat::where('ten','like','D%')->count();
$max=Nhasanxuat::where('id','<', 10)->max('status');
echo $count, " ", $max;

Chèn record với Eloquent model

Để tạo record mới trong table, bạn tạo instance cho model + gán giá trị cho các field rồi gọi phương thức save()

$nsx = new App\Models\Nhasanxuat;
$nsx->ten = 'Compact';
$nsx->logo = 'images/compact.jpg';
$nsx->save();

Cũng có thể dùng hàm create() để tạo record mới:

$kq = App\Models\Nhasanxuat::create([
   'ten' => 'Gigabyte',
   'status' =>1
]);

Để dùng hàm create(), bạn cần khai báo các field trong thuộc tính $fillable của model như sau:

protected $fillable = [ 'ten', 'logo', 'status'];

Cập nhật record với Eloquent model

Để tạo cập nhật 1 record trong table, bạn lấy record trong table với hàm find(). Sau đó gán giá trị cho các field rồi gọi phương thức save()

$nsx = App\Models\Nhasanxuat::find(1);
$nsx->ten = 'Realme';
$nsx->save();

Cũng có thể dùng hàm update() để cập nhật các record

App\Models\Nhasanxuat::where ('id',1)
->update(['ten'=>'Oppo', 'status'=>2]);

Xóa record với Eloquent model

Để xóa 1 record trong table, gọi phương thức delete()

$nsx = App\Models\Nhasanxuat::find(1);
$nsx ->delete();

Một cách khách để xóa nhanh record là dùng hàm destroy() và truyền vào các giá trị trong field khóa chính

App\Models\Nhasanxuat::destroy(1);
App\Models\Nhasanxuat::destroy([3,4,5]);

Xóa nhiều record thõa điều kiện cũng được, bạn dùng hàm delete()

App\Models\Nhasanxuat::where("status",0)->delete();

Một hàm nữa có thể được dùng là truncate() : xóa tất cả record

App\Models\Nhasanxuat::truncate();

Xóa mềm record với Eloquent model

Thay vì thực sự xóa các record khỏi database, Eloquent cũng cung cấp kiểu “soft delete” (xoá mềm) record. Tức là không thực sự xóa, chỉ đánh dấu xóa.

Để cho phép xoá mềm, bạn cần:

  • Thêm vào table 1 field có tên deleted_at kiểu là timestamp, cho phép NULL. Eloquent sẽ cập nhật field này khi revord bị xóa mềm.
  • Ở đầu model, thêm lệnh: use Illuminate\Database\Eloquent\SoftDeletes;
  • Trong model, thêm lệnh use SoftDeletes;

Lúc này, khi xóa record, cột deleted_at sẽ được Eloquent cập nhật. Và khi bạn query, record sẽ tự động bị loại khỏi tất cả các kết quả.

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Nhasanxuat extends Model {
    protected $table = 'nhasanxuat';
    protected $attributes = ['logo' =>'','status'=>0,];
    protected $fillable = ['ten','logo','status'];
    use SoftDeletes;
}
$nsx = App\Models\Nhasanxuat::find(6);
$nsx ->delete();

Phục hồi record đã xóa mềm

Để khôi phục lại một record đã xóa mềm, sử dụng phương thức restore(). Khi được restore, giá trị trong deleted_at sẽ mất, còn updated_at sẽ được cập nhật.

$nsx = App\Models\Nhasanxuat::find(7);
$nsx ->delete();
//...
$nsx ->restore();

Có thể restore nhiều record đã xóa :

App\Models\Nhasanxuat::withTrashed()
->where('status',1)
->restore();

Để xoá vĩnh viễn một record đã xóa mềm, sử dụng hàm forceDelete. Ví dụ xóa vĩnh viễn record có id là 7

App\Models\Nhasanxuat::withTrashed()
->where('id',7)
->forceDelete();

Event trong eloquent

Eloquent model fire ra nhiều sự kiện, cho phép bạn đón và xử lý nếu cần:

  • creating: trước khi create record.
  • created: sau khi created record.
  • updating: trước khi update record.
  • updated: sau khi update record.
  • deleting: trước khi xóa record.
  • deleted: sau khi xóa record.
  • retrieved: khi nhận dữ liệu từ database.

1. Trong model, định nghĩa hàm boot và các hàm đón sự kiện

<?php // app/Models/Nhaxsanxuat.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Log;
class Nhasanxuat extends Model {
   protected $table = "nhasanxuat";
   protected $attributes = ['logo' => '','status' => 0];
   protected $fillable = ['ten','logo','status'];
   public static function boot() {
      parent::boot();
      static::creating(function($item) {
        if ($item->status>2) $item->status = 2;
      });
      static::created(function($item) {
        Log::info('Đã chèn nsx: '.$item);
      });
      static::updating(function($item) {
        if ($item->status<0) $item->status = 0;
      });
      static::updated(function($item) {
        Log::info('Đã cập nhật nsx: '.$item);
      });
      static::deleted(function($item){
        Log::info('Đã xóa nsx: '.$item);
      });
   }
}

2. Gọi các hàm chèn, chỉnh, xóa record

<?php //routes/web.php
use Illuminate\Support\Facades\Route;
use App\Models\Nhasanxuat;
Route::get('/themnsx', function () {
   Nhasanxuat::create(['ten'=>'Gigabyte','status'=>10]);
});
Route::get('/chinhnsx', function () {
   Nhasanxuat::find(1)->update(['ten'=>'Intel','status'=>-5]);
});
Route::get('/xoansx', function () {
   Nhasanxuat::find(1)->delete();
});

3. Request và xem kết quả db + file storage/logs/Laravel.log

file storage/logs/Laravel.log

Sử dụng Eloquent ORM là bài viết hướng dẫn tương tác với database từ Laravel bằng cách dùng thư viện tích hợp sẵn : Eloquent

Đến đây thì bạn đã biết sử dụng Eloquent ORM để tương tác với database rồi đó. Cần xem thêm thông ttin thì xem ở link này https://laravel.com/docs/9.x/eloquent .

Một bài viết liên quan đến việc tương tác database từ Laravel nữa đó là bài Sử dụng query builder trong Laravel, bạn xem thêm nhé, đó cũng là cách đơn giản trong Laravel khi cần làm việc với database.