10 Tính năng trong Laravel Eloquent có thể bạn chưa biết

LAMP Nov 16, 2020

Laravel là một framework có rất nhiều tính năng và thật khó để biết tất cả. Dưới đây là một số tính năng mà có thể bạn chưa biết.

1. Custom timestamp column names
Khi tạo migration cho model thì các mốc thời gian mặc định là created_atupdated_at. Bạn có thể ghi đè tên các cột này bằng cách xác định 1 biến không đổi trong model. Tương tự, khi bạn sử dụng SoftDeletes bạn cũng có thể ghi đè cột deleted_at.

class Product extends Model{    
	use SoftDeletes;
    
	const CREATED_AT = 'created';
	const UPDATED_AT = 'last_update';
	const DELETED_AT = 'is_deleted';
}

2. Override updated_at when saving
Phương thức save() có thể nhận các parameter, nên bạn có thể yêu cầu bỏ qua chức năng mặc định của updated_at để fill vào giá trị bạn muốn.

$product = Product::find($id);
$product->updated_at = '2020-01-01 00:00:00';
$product->save(['timestamps' => false]);

- Ngoài ra, bạn còn có thể bỏ qua updated_at khi update model

$product = Product::find($id);
$product->name = 'Sample';
$product->timestamps=false;
$product->save();

3. Clone Model
Bạn có thể clone một model bằng cách sử dụng replicate()

$product = Product::find($id);
$newProduct = $product->replicate();
$newProduct->save();

4. BelongsTo Default Models
Ví dụ: Product phụ thuộc vào Category và ở Blade code :

{{ $product->category->name }}

Nhưng điều gì sẽ xảy ra nếu một ngày đẹp trời category bị xóa. Dĩ nhiên, bạn sẽ gặp lỗi như “property of non-object” và cũng có rất nhiều cách khắc phục lỗi trên như:

{{ $product->category->name ?? '' }}

Tuy nhiên, bạn cũng có thể thực hiện nó trên Eloquent relationship:

public function category() {    
	return $this->belongsTo('App\Models\Category')->withDefault();
}

Bạn cũng có thể gán các giá trị default property

public function category() {    
	return $this->belongsTo('App\Models\Category')->withDefault([
		'name' => 'sample'
	]);
}

5. Check if Model changed
Kiểm tra xem Model hoặc Attribute có thay đổi hay không sử dụng isDirty()

$product = Product::find($id);
$product->isDirty();                     //false
$product->name = "New name";
$product->isDirty();                     //true

Ngoài ra, bạn cũng có thể kiểm tra attribute cụ thể như sau:

$product->isDirty('name')              //true

6. WhereX

$product = Product::where('status', 1)->get();

Thông thường ta hay viết như thế này, tuy nhiên cũng có thể viết

$product = Product::whereStatus(1)->get(); 

Bạn có thể đổi tên của bất kỳ trường nào và thêm nó vào như một hậu tố của “where”.
Ví dụ : product_id -> whereProductId
Ngoài ra, có một số phương pháp được xác định trước trong Eloquent liên quan đến ngày / giờ như : whereDate,  whereDay, whereMonth, whereYear

7. Get original attributes
Sau khi thay đổi bản ghi Eloquent, bạn có thể lấy được các attribute gốc bằng các gọi getOriginal()

$product = Product::find($id);
$product->name;                       //Old name
$product->name = "New name";          //New name
$product->getOriginal('name');        //Old name
$product->getOriginal();              //Original $product record

8. Reload fresh Model
Reload fresh Model từ cơ sở dữ liệu bằng cách sử dụng fresh()

$product = Product::find($id);
$product->name;                  //Old name
$product->name = "New name";     //New name 
$product = $product->fresh();
$product->name;                  //Old name

9. X or Y methods
Eloquent có khá nhiều hàm kết hợp lại với nhau, chẳng hạn như “vui lòng thực hiện X còn không thì thực hiện Y”.
Ví dụ 1 : findOrFail()
Thay vì

$product = Product::find($id);
if(!$product) {	
    abort(404);
}

 Hãy thử viết lại như sau :

$product = Product::findOrFail($id);

Ví dụ 2: firstOrCreate()
Thay vì viết như này :

$product = Product::where('name', $name)->first();
if(!$product) {	
    Product::create([
        'name' => $name
    ]);
}

Chỉ cần viết như thế này:

$product = Product::firstOrCreate(['name' => $name]);

Tương tự như: firstOrNew, updateOrCreate
10. Find multiple entries
Mọi người điều biết đến phương thức find(), nhưng hình như lại khá ít người biết tới nó có thể chấp nhận được nhiều ID như một mảng.

$products = Product::find([1,2,3]);

Tổng kết
Bài viết của mình tạm thời tới đây thôi. Nói về Eloquent thì nó rất rộng nên mọi người cùng nhau tìm hiểu và chia sẻ nhé.

 

Tags

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.