Toidicode.com

Toidicode.com

BASIC TO ADVANCE

Bài 36: Eloquent ORM collection trong Laravel 8


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!

Vũ Thanh Tài

About author
The best way to learn is to share
Xem tất cả bài đăng

0 Comments

Bài viết chưa có ai bình luận, hãy là người đầu tiên đi bạn!

Bình luận

Captcha