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 fromto 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 fromto, trong trường hợp mình đặt ra cũng có thể sử dụng id 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
    ]

fromto 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 ♥️