Chia sẻ kỹ thuật Upsert - Laravel và có thể bạn chưa biết

2nd Nov 2022
Chia sẻ kỹ thuật Upsert - Laravel và có thể bạn chưa biết
Table of contents

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ụ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
    ]

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.

Bạn thấy bài viết này như thế nào?
0 reactions

Add new comment

Image CAPTCHA
Enter the characters shown in the image.

Related Articles

Danh sách này có 4 sản phẩm nên chưa cần phân trang, nếu số lượng sản phẩm lên đến vài chục sản phẩm

Hiện nay kiến trúc Microservices đang là chủ đề được cộng đồng Developer vô cùng quan tâm

Hôm nay chúng ta cùng tìm hiểu về Eloquent trong Laravel với mối quan hệ nhiều - nhiều (many to many relationship)

Kiểm soát hợp lí truy cập nội dung trang web là yếu tố quyết định trong việc điều hành một máy chủ bảo mật.

Trong lập trình web, authorization (phân quyền) là chức năng vô cùng quan trọng và không thể thiếu