Làm cách nào để cập nhật giá trị cột cụ thể trong laravel?

Hôm nay tôi thấy một đoạn mã mà lập trình viên muốn cập nhật mô hình laravel cùng lúc, anh ta muốn tăng giá trị của một cột. Hôm nay, tôi sẽ chỉ cho bạn cách đơn giản nhất để tăng cột và cập nhật bản ghi Laravel

Chỉ cần tưởng tượng rằng chúng ta có một bảng tên là


$posts = App\Post::where('id', 1)->increment('visits', 1);
6, cấu trúc của nó giống như vậy-

bài viết

- id
- title
- body
- visits

Bây giờ, vì một số lý do, bạn có thể chỉ muốn cập nhật cột


$posts = App\Post::where('id', 1)->increment('visits', 1);
7 của bài đăng khi

$posts = App\Post::where('id', 1)->increment('visits', 1);
8 là 1. Có một số cách để làm điều đó

Cách 1

$posts = App\Post::where('id', 1)->update([
    'visits' => \DB::raw('visits+1')
]);

Cách 2

Ngoài ra, bạn cũng có thể sử dụng chức năng


$posts = App\Post::where('id', 1)->increment('visits', 1);
9


$posts = App\Post::where('id', 1)->increment('visits', 1);

Điều đó không dễ dàng hơn sao?

Bây giờ, nếu bạn muốn tìm nhiều hơn 1 bài đăng và cố gắng cập nhật cột


$posts = App\Post::where('id', 1)->increment('visits', 1);
7 thì sao?

Sớm muộn gì bạn cũng sẽ rơi vào tình huống cần cập nhật nhiều bản ghi cơ sở dữ liệu với các giá trị khác nhau. Laravel hỗ trợ cập nhật hàng loạt khi chỉ có một khả năng giá trị cho cột đã cho. Trong tài liệu chúng ta có thể tìm thấy ví dụ này

Flight::where('active', 1)
->where('destination', 'San Diego')
->update(['delayed' => 1]);

Điều này sẽ đặt thuộc tính bị trì hoãn thành đúng cho tất cả các chuyến bay đang hoạt động và có điểm đến là San Diego. Trong trường hợp này, điều này hoàn toàn ổn, nó sẽ chỉ sử dụng một truy vấn và nó sẽ khá nhanh. Nhưng nếu chúng ta muốn cập nhật nhiều bản ghi với các giá trị khác nhau thì sao? . Một số người dùng có 10 điểm, một số 20, v.v. Sẽ có một truy vấn cho mọi người dùng mà chúng tôi muốn cập nhật.
Nếu chúng tôi phải cập nhật 5000 bản ghi, chúng tôi sẽ cần sử dụng vòng lặp

// $ids = array of random user ids
// $data = array of random numbers for points
for ($i = 0; $i <= 5000; $i++) {
User::where(['id' => $ids[$i]])
->update(['points' => $data[$i]]);
}
0 và thực hiện 5000 truy vấn. Tôi đã cố gắng mô phỏng tình huống này và so sánh xem sẽ mất bao nhiêu thời gian để hoàn thành công việc. Vì vậy, tôi đã tạo cơ sở dữ liệu với 100 000 người dùng, chuẩn bị dữ liệu để cập nhật và chạy nó bên trong vòng lặp
// $ids = array of random user ids
// $data = array of random numbers for points
for ($i = 0; $i <= 5000; $i++) {
User::where(['id' => $ids[$i]])
->update(['points' => $data[$i]]);
}
0.

// $ids = array of random user ids
// $data = array of random numbers for points
for ($i = 0; $i <= 5000; $i++) {
User::where(['id' => $ids[$i]])
->update(['points' => $data[$i]]);
}

Trung bình mất 5. 47676 giây để cập nhật dữ liệu

Chúng tôi có thể bao bọc giao dịch nội bộ này và nó sẽ có tác động lớn đến hiệu suất

DB::transaction(function() use($ids, $data) {
for ($i = 0; $i <= 5000; $i++) {
User::where(['id' => $ids[$i]])
->update(['points' => $data[$i]]);
}
});

Chúng ta đang nói về 1. Trung bình 68872 giây. Điều này tốt hơn nhiều nhưng chúng ta có thể cải thiện điều này hơn nữa không?

Hãy thử thực hiện công việc tương tự bằng cách sử dụng gói cập nhật hàng loạt cho Laravel

________số 8

Tham số đầu tiên là mô hình chúng tôi muốn cập nhật, tham số thứ hai là dữ liệu và tham số thứ ba là cột xác định duy nhất các bản ghi trong bảng được liên kết.
Việc này chỉ mất 1. 0531 giây trung bình và một truy vấn duy nhất. Điều này đã được thực hiện bằng chức năng CASE của MySql.
Bây giờ, hãy kiểm tra gói này và xem phương thức cập nhật hoạt động như thế nào bằng cách tập trung vào các phần quan trọng nhất của mã.

public function update(Model $table, array $values, string $index = null, bool $raw = false)$final = [];
$ids = [];
foreach ($values as $key => $val) {
$ids[] = $val[$index];
foreach (array_keys($val) as $field) {
if ($field !== $index) {

Hãy tưởng tượng rằng phần tử đầu tiên của

// $ids = array of random user ids
// $data = array of random numbers for points
for ($i = 0; $i <= 5000; $i++) {
User::where(['id' => $ids[$i]])
->update(['points' => $data[$i]]);
}
2 là mảng này

// $ids = array of random user ids
// $data = array of random numbers for points
for ($i = 0; $i <= 5000; $i++) {
User::where(['id' => $ids[$i]])
->update(['points' => $data[$i]]);
}
3
Chúng ta có hai vòng lặp foreach lồng nhau. Cái đầu tiên sẽ lặp lại trên
// $ids = array of random user ids
// $data = array of random numbers for points
for ($i = 0; $i <= 5000; $i++) {
User::where(['id' => $ids[$i]])
->update(['points' => $data[$i]]);
}
2 của chúng ta, mảng gồm 5000 mảng. Nó sẽ trích xuất giá trị của 'id' từ mảng đầu tiên và đẩy nó vào bên trong mảng
// $ids = array of random user ids
// $data = array of random numbers for points
for ($i = 0; $i <= 5000; $i++) {
User::where(['id' => $ids[$i]])
->update(['points' => $data[$i]]);
}
5.
______46 sẽ bằng 100.

$posts = App\Post::where('id', 1)->update([
    'visits' => \DB::raw('visits+1')
]);
5

Vòng lặp tiếp theo sẽ trích xuất các trường cần cập nhật. Trong trường hợp của chúng tôi, giá trị của trường $ sẽ là chuỗi 'điểm' và giá trị của

// $ids = array of random user ids
// $data = array of random numbers for points
for ($i = 0; $i <= 5000; $i++) {
User::where(['id' => $ids[$i]])
->update(['points' => $data[$i]]);
}
7 sẽ là '230'. Chúng tôi an toàn trước SQL injection vì các biến này được truyền qua hàm
// $ids = array of random user ids
// $data = array of random numbers for points
for ($i = 0; $i <= 5000; $i++) {
User::where(['id' => $ids[$i]])
->update(['points' => $data[$i]]);
}
8.
Bước cuối cùng là tạo mảng có tên của cột cần được cập nhật làm khóa và chuỗi đại diện cho câu lệnh đã chuẩn bị cho hàm CASE của MySql làm giá trị. Sau đó, chúng tôi đẩy mảng đó vào bên trong biến
// $ids = array of random user ids
// $data = array of random numbers for points
for ($i = 0; $i <= 5000; $i++) {
User::where(['id' => $ids[$i]])
->update(['points' => $data[$i]]);
}
9.
Vì vậy, sau khi thực hiện vòng lặp
// $ids = array of random user ids
// $data = array of random numbers for points
for ($i = 0; $i <= 5000; $i++) {
User::where(['id' => $ids[$i]])
->update(['points' => $data[$i]]);
}
0 thứ hai, mảng
// $ids = array of random user ids
// $data = array of random numbers for points
for ($i = 0; $i <= 5000; $i++) {
User::where(['id' => $ids[$i]])
->update(['points' => $data[$i]]);
}
9 sẽ trông như thế này.


$posts = App\Post::where('id', 1)->increment('visits', 1);
1

Chúng tôi chỉ cập nhật cột 'điểm' nhưng nếu chúng tôi cũng cập nhật một số cột khác, nó cũng sẽ thêm chúng


$posts = App\Post::where('id', 1)->increment('visits', 1);
2

Khi cả hai vòng lặp được thực hiện, mảng

DB::transaction(function() use($ids, $data) {
for ($i = 0; $i <= 5000; $i++) {
User::where(['id' => $ids[$i]])
->update(['points' => $data[$i]]);
}
});
2 sẽ bao gồm 5000 chuỗi giống như chuỗi ở trên

Cuối cùng, nó sẽ tạo một chuỗi truy vấn bằng cách kết hợp các giá trị từ các mảng

// $ids = array of random user ids
// $data = array of random numbers for points
for ($i = 0; $i <= 5000; $i++) {
User::where(['id' => $ids[$i]])
->update(['points' => $data[$i]]);
}
9 và
// $ids = array of random user ids
// $data = array of random numbers for points
for ($i = 0; $i <= 5000; $i++) {
User::where(['id' => $ids[$i]])
->update(['points' => $data[$i]]);
}
5

Làm cách nào để cập nhật giá trị cột trong laravel?

Để cập nhật dữ liệu trong một bảng, bạn cần. Đầu tiên, chỉ định tên bảng mà bạn muốn thay đổi dữ liệu trong mệnh đề CẬP NHẬT. Thứ hai, gán một giá trị mới cho cột mà bạn muốn cập nhật. Thứ ba, chỉ định những hàng bạn muốn cập nhật trong mệnh đề WHERE

Làm cách nào để cập nhật một bản ghi trong laravel?

getuserData() – Lấy tất cả các bản ghi từ bảng người dùng và trả lại. Nếu $id khác 0 thì chọn ghi theo id
insertData() – Từ chức năng này chèn một bản ghi mới. Kiểm tra tên người dùng tồn tại hay không trong bảng người dùng. .
updateData() – Từ chức năng này, bản ghi cập nhật. .
deleteData() – Từ chức năng này xóa bản ghi

Làm cách nào để cập nhật dữ liệu hiện có trong laravel?

Chúng tôi có thể cập nhật các bản ghi bằng cách sử dụng mặt tiền DB với phương thức cập nhật . Cú pháp của phương thức cập nhật như trong bảng sau. Chạy một câu lệnh cập nhật đối với cơ sở dữ liệu.