Upsert - Laravel và có thể bạn chưa biết ?!?!
Trước giờ thật khó khăn khi chúng ta cần update nhiều bản ghi trong Laravel nhỉ. Các bạn có thể tìm hiểu đến LaravelBatch một package mà chúng ta sẽ phải cài đặt nếu chúng ta muốn sử dụng tính năng update nhiều bản ghi khi sử dụng Laravel những bản cũ dưới 8.0.
Nhưng với Laravel 8.1 chúng ta đã được cung cấp một phương thức có thể update nhiều bản ghi với chỉ duy nhất một câu query. Các bạn sẽ chả cần cài bất cứ package hỗ trợ nào hay phải update trong vòng for nữa. Hãy quên nó đi vì hôm nay mình sẽ giới thiệu cho các bạn một phương thức đáp ứng đủ những thứ đó.
Và bây giờ chúng ta sẽ đi vào phần chính của chủ đề hôm nay, làm thế nào để upsert
hoạt động.
Ví dụ bạn có một bảng flights
sau
id | from | to | number_of_passengers |
---|---|---|---|
1 | Hà Nội | Hồ Chí Minh | 100 |
2 | Hồ Chí Minh | Hải Phòng | 150 |
3 | Đà Nẵng | Hà Nội | 130 |
4 | Phú Quốc | Đà Nẵng | 170 |
Các bạn có thể thấy trường id
hoặc cặp from
và to
là unique với bảng trên và chúng ta sẽ update số lượng hành khách tương ứng với những trường unique đó.
Flight::query()->upsert([
[
'from' => 'Hà Nội',
'to' => 'Hồ Chí Minh',
'number_of_passengers' => 150
],
[
'from' => 'Hồ Chí Minh',
'to' => 'Hải Phòng',
'number_of_passengers' => 90
],
[
'from' => 'Đà Nẵng',
'to' => 'Hà Nội',
'number_of_passengers' => 200
],
[
'from' => 'Phú Quốc',
'to' => 'Đà Nẵng',
'number_of_passengers' => 120
],
[
'from' => 'Phú Quốc',
'to' => 'Hà Nội',
'number_of_passengers' => 140
]
], ['from', 'to'], ['number_of_passengers']);
Kết quả chúng ta sẽ nhận được đó là
id | from | to | number_of_passengers |
---|---|---|---|
1 | Hà Nội | Hồ Chí Minh | 150 |
2 | Hồ Chí Minh | Hải Phòng | 90 |
3 | Đà Nẵng | Hà Nội | 200 |
4 | Phú Quốc | Đà Nẵng | 120 |
5 | Phú Quốc | Hà Nội | 140 |
Các bạn có thể thấy upsert
nhận đến ba đối số:
- Đối số thứ nhất là các giá trị để insert hoặc update
- Đối số thứ 2 liệt kê cột hoặc các cột được xác định là duy nhất của các bảng ghi (ở đây mình dùng
from
vàto
, trong trường hợp mình đặt ra cũng có thể sử dụngid
vì nó là duy nhất). - Đối số thứ 3 liệt kê cột hoặc các cột chúng ta muốn cập nhật giá trị cho nó (ở ví dụng này mình update lại cột
number_of_passengers
)
Trong ví dụ có 4 data mình đã update trường number_of_passengers
đó là
[
'from' => 'Hà Nội',
'to' => 'Hồ Chí Minh',
'number_of_passengers' => 150
],
[
'from' => 'Hồ Chí Minh',
'to' => 'Hải Phòng',
'number_of_passengers' => 90
],
[
'from' => 'Đà Nẵng',
'to' => 'Hà Nội',
'number_of_passengers' => 200
],
[
'from' => 'Phú Quốc',
'to' => 'Đà Nẵng',
'number_of_passengers' => 120
]
Vì from
và to
của các dữ liệu này đã có trong bảng flights
. Và mình đã insert
thêm 1 bản ghi đó là
[
'from' => 'Phú Quốc',
'to' => 'Hà Nội',
'number_of_passengers' => 140
]
Vì cặp from
to
này chưa xuất hiện trong bảng flights
Phương thức mới này ở Laravel 8.1 nó sẽ khá dễ dàng để các bạn xử lý những bài toán với trường hợp phải update nhiều bản ghi hay insert bản ghi. Hy vọng bài viết này sẽ giúp ích cho các bạn.
Hẹn gặp lại các bạn ở những bài viết sau. Love all ♥️