Get in touch
or send us a question?
CONTACT

20 thủ thuật Laravel Eloquent ORM (Phần 2)

1. Find multiple entries

Mọi người đều biết find() method, đúng ko?

$user = User::find(1);

Ít người biết rằng nó có thể chấp nhận nhiều ID như một mảng:

$users = User::find([1,2,3]);

2. WhereX

Có một cách đơn giản để làm điều này:

$users = User::where('approved', 1)->get();

Như sau:

$users = User::whereApproved(1)->get(); 

Vâng, bạn có thể thay đổi tên của bất kỳ field nào và thêm nó vào như một hậu tố của function where và nó sẽ hoạt động: Ngoài ra, có một số pre-defined method trong Eloquent, liên quan date/time:

User::whereDate('created_at', date('Y-m-d'));
User::whereDay('created_at', date('d'));
User::whereMonth('created_at', date('m'));
User::whereYear('created_at', date('Y'));

3. Order by relationship

Một “mẹo nhỏ” phức tạp hơn một chút. Điều gì sẽ xảy ra nếu bạn có chủ đề trên diễn đàn nhưng muốn “`order“` chúng theo bài đăng mới nhất? Yêu cầu khá phổ biến trong các diễn đàn với các chủ đề cập nhật mới nhất ở trên top, phải không?

Đầu tiên, mô tả relationship riêng biệt cho bài đăng mới nhất về chủ đề:

public function latestPost()
{
    return $this->hasOne(\App\Post::class)->latest();
}

Và sau đó, trong controller của chúng ta, ta có thể làm điều “magic” này:

$users = Topic::with('latestPost')->get()->sortByDesc('latestPost.created_at');

4. Eloquent::when() – no more if-else’s

Nhiều người trong chúng ta viết các truy vấn có điều kiện với “if-else” như thế này:

if (request('filter_by') == 'likes') {
    $query->where('likes', '>', request('likes_amount', 0));
}
if (request('filter_by') == 'date') {
    $query->orderBy('created_at', request('ordering_rule', 'desc'));
}

Nhưng có một cách tốt hơn bằng cách sử dụng when() function:


$query = Author::query();
$query->when(request('filter_by') == 'likes', function ($q) {
    return $q->where('likes', '>', request('likes_amount', 0));
});
$query->when(request('filter_by') == 'date', function ($q) {
    return $q->orderBy('created_at', request('ordering_rule', 'desc'));
});

Nó có thể không ngắn hơn, nhưng mạnh nhất là truyền các parameter:

$query = User::query();
$query->when(request('role', false), function ($q, $role) { 
    return $q->where('role_id', $role);
});
$authors = $query->get();

5. BelongsTo Default Models

Giả sử bạn có Post belongTo Author và sau đó là Blade code:

{{ $post->author->name }}

Nhưng nếu author bị xóa hoặc không được set vì một lý do nào đó thì sao? Bạn sẽ nhận được một lỗi, đại loại là “property of non-object”.

{{ $post->author->name ?? '' }}

Nhưng bạn có thể làm điều đó trên Eloquent relationship:

public function author()
{
    return $this->belongsTo('App\Author')->withDefault();
}

Trong ví dụ này, author() relation sẽ trả về một empty App\Author model nếu không có author nào được đính kèm vào post. Hơn nữa, chúng ta có thể gán giá trị default property cho default modedl đó.

public function author()
{
    return $this->belongsTo('App\Author')->withDefault([
        'name' => 'Guest Author'
    ]);
}