Tiếp tục với chuỗi bài về eloquent ORM, bài này mình sẽ giới thiệu với mọi người về collection eloquent ORM trong Laravel.
1. Giới thiệu.
Tất cả các phương thức trong eloquent ORM mà trả về nhiều hơn một bản ghi thì Laravel sẽ trả về một instance collection của Illuminate\Database\Eloquent\Collection
class, bao gồm cả truy vấn đến relationship.
Eloquent Collection này được kế thừa Base collection của Laravel và sẽ bổ sung thêm một số các phương thức khác để hỗ trợ xử lý thêm đối với eloquent model.
2. Các phương thức bổ sung.
Dưới đây sẽ là các phương thức bổ sung trong Eloquent Collection.
contains
Phương thức contains
dùng để xác định xem một model có xuất hiện trong collection hay không. Phương thức nhận vào là một primary key hoặc là một instance model.
VD:
use App\Models\User;
$users = User::where('active', 1)->get();
$users->contains(1);
$users->contains(User::find(1));
diff
Phương thức diff
sẽ trả về tất cả các model không xuất hiện trong collection.
VD:
use App\Models\User;
$users = User::where('active', 1)->get();
$users = $users->diff(User::whereIn('id', [1, 2, 3])->get());
except
Phương thức except
sẽ trả về tất cả các model không xuất hiện trong array key truyền vào.
VD:
use App\Models\User;
$users = User::where('active', 1)->get();
$users = $users->except([1, 2, 3]);
find
Phương thức find
sẽ trả về tất cả các model xuất hiện trong collection với điều kiện truyền vào phương thức. Giá trị truyền vào có thể là một giá trị của primary key, instance model hoặc mảng.
VD:
$users = User::all();
$user = $users->find(1);
// hoặc
$users = User::all();
$user = $users->find([1, 2, 3]);
// hoặc
$users = User::all();
$user = $users->find(User::find(1));
fresh
Phương thức fresh
sẽ query đến database và làm mới hết các giá trị trong collection. Nếu bạn muốn làm mới một relation cụ thể nào đó thì có thể truyền vào relation name.
VD:
// Làm mới tất cả dữ liệu trong collection.
$users = $users->fresh();
// Làm mới dữ liệu relation comments trong collection.
$users = $users->fresh('comments');
intersect
Phương thức intersect
sẽ trả về tất cả model có trong một eloquent collection khác.
VD:
use App\Models\User;
$users = $users->intersect(User::whereIn('id', [1, 2, 3])->get());
load
Phương thức load
sẽ thực thiện eager load relationship cho tất cả các model trong collection.
VD:
$users->load(['comments', 'posts']);
$users->load('comments.author');
loadMissing
Phương thức loadMissing
sẽ thực hiện eager load relationship data cho các model trong collection chưa được load.
VD:
$users->loadMissing(['comments', 'posts']);
$users->loadMissing('comments.author');
modelKeys
Phương thức modelKeys
sẽ trả về một mảng primary key của các model trong collection.
$users->modelKeys();
// [1, 2, 3, 4, 5]
makeVisible
Phương thức makeVisible
sẽ hiển thị các attribute của các model trong collection.
VD:
$users = $users->makeVisible(['passsword']);
makeHidden
Phương thức makeHidden
ngược lại với phương thức makeVisible. Nó sẽ hidden các attribute của các model trong collection.
$users = $users->makeHidden(['email']);
only
Phương thức only
sẽ trả về tất cả các model xuất hiện trong mảng dữ liệu truyền vào, với mảng giá trị truyền vào là giá trị của primary key data.
VD:
$users = $users->only([1, 2, 3]);
toQuery
Phương thức toQuery
sẽ trả về một query builder object chứa whereIn data với giá trị là các primary key data của các model trong collection.
VD:
use App\Models\User;
$users = User::where('status', 'VIP')->get();
$users->toQuery()->update([
'status' => 'Administrator',
]);
unique
Phương thức unique
sẽ loại bỏ các model có cùng giá trị, cùng kiểu giá trị primary key của model trong collection.
VD:
$users = $users->unique();
3. Custom Collection.
Trong một số trường hợp, nếu như bạn không muốn eloquent trả về một Illuminate\Database\Eloquent\Collection
mà bạn muốn trả về một custom collection của bạn. Lúc này bạn có thể khai báo trong phương thức newCollection
của model đó.
VD: Trả về một UserCollection
trong User
model khi query.
<?php
namespace App\Models;
use App\Support\UserCollection;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* Create a new Eloquent Collection instance.
*
* @param array $models
* @return \Illuminate\Database\Eloquent\Collection
*/
public function newCollection(array $models = [])
{
return new UserCollection($models);
}
}
4. Lời kết.
Như các bạn đã thấy thì Eloquent thực sự support rất mạnh mẽ, mọi người chỉ việc sử dụng thôi, ngoài ra không cần phải code thêm gì cả. Nếu có custom thêm thì khai báo cũng hết sức đơn giản.
Đăng ký nhận tin.
Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!
0 Comments