Làm cách nào để xóa dữ liệu mối quan hệ trong Laravel?

Một mẫu mà tôi thường gặp khi phát triển biểu mẫu là biểu mẫu chứa mối quan hệ

$recipe->ingredients[]->createMany[[
['name' => 'Pecorino cheese'],
['name' => 'Spaghetti'],
['name' => 'Pancetta'],
['name' => 'Cream'],
]];
0. Ví dụ: một biểu mẫu công thức có khả năng thêm các thành phần

Laravel giúp dễ dàng xác thực một biểu mẫu như thế này, nhờ. Ít rõ ràng hơn một chút là tạo, cập nhật và xóa các mô hình liên quan [trong trường hợp này là các thành phần]

Trong bài viết này, tôi sẽ giải thích cho bạn cách tạo một macro cho phép bạn gọi

$recipe->ingredients[]->createMany[[
['name' => 'Pecorino cheese'],
['name' => 'Spaghetti'],
['name' => 'Pancetta'],
['name' => 'Cream'],
]];
1 trên các mối quan hệ Eloquent
$recipe->ingredients[]->createMany[[
['name' => 'Pecorino cheese'],
['name' => 'Spaghetti'],
['name' => 'Pancetta'],
['name' => 'Cream'],
]];
0

$recipe
->ingredients[]
->createUpdateOrDelete[$data];

Cảm thấy tự do ngay lập tức

Trước khi xử lý macro, hãy nghĩ xem chúng ta sẽ xử lý vấn đề này như thế nào

Việc gửi biểu mẫu đầu tiên của biểu mẫu công thức của chúng tôi rất đơn giản. Tất cả các thành phần đều mới, vì vậy chúng tôi chỉ có thể tạo ra chúng

$recipe->ingredients[]->createMany[[
['name' => 'Pecorino cheese'],
['name' => 'Spaghetti'],
['name' => 'Pancetta'],
['name' => 'Cream'],
]];

Nhưng điều đó sẽ không hiệu quả đối với các lần gửi biểu mẫu tiếp theo, những điều này có thể dẫn đến các tình huống khác nhau. Thành phần có thể bị thay đổi, thiếu hoặc hoàn toàn mới

# First request
recipe:
title: Spaghetti carbonara
ingredients:
- name: Pecorino cheese
- name: Spaghetti
- name: Pancetta
- name: Cream # Missing in second request

# Second request
recipe:
title: Spaghetti carbonara
ingredients:
- id: 1
name: Pecorino cheese
- id: 2
name: Spaghetti
- id: 3
name: Guanciale # Changed
- name: Salt & pepper # New
- name: Eggs # New

Như bạn có thể thấy trong dữ liệu yêu cầu giả định, yêu cầu thứ hai chứa id của các thành phần hiện có. Với thông tin này, chúng tôi có thể xác định thành phần nào sẽ được tạo, cập nhật hoặc xóa

Các thành phần có id nên được cập nhật và những thành phần không có id được tạo. Đối với hai trường hợp này, chúng ta có thể sử dụng các phương thức

$recipe->ingredients[]->createMany[[
['name' => 'Pecorino cheese'],
['name' => 'Spaghetti'],
['name' => 'Pancetta'],
['name' => 'Cream'],
]];
3 hoặc
$recipe->ingredients[]->createMany[[
['name' => 'Pecorino cheese'],
['name' => 'Spaghetti'],
['name' => 'Pancetta'],
['name' => 'Cream'],
]];
4 của Laravel. Tôi sẽ sử dụng vì phương thức này có thể xử lý nhiều bản ghi trong một lần [một truy vấn SQL]

⚠️ Nếu bạn muốn dấu thời gian của

$recipe->ingredients[]->createMany[[
['name' => 'Pecorino cheese'],
['name' => 'Spaghetti'],
['name' => 'Pancetta'],
['name' => 'Cream'],
]];
5 được cập nhật chính xác hoặc dựa vào , thì bạn nên sử dụng
$recipe->ingredients[]->createMany[[
['name' => 'Pecorino cheese'],
['name' => 'Spaghetti'],
['name' => 'Pancetta'],
['name' => 'Cream'],
]];
3 thay vì
$recipe->ingredients[]->createMany[[
['name' => 'Pecorino cheese'],
['name' => 'Spaghetti'],
['name' => 'Pancetta'],
['name' => 'Cream'],
]];
4. Điều này sẽ yêu cầu bạn lặp lại tất cả các thành phần đến và chuyển chúng vào phương thức
$recipe->ingredients[]->createMany[[
['name' => 'Pecorino cheese'],
['name' => 'Spaghetti'],
['name' => 'Pancetta'],
['name' => 'Cream'],
]];
3

Trước khi xem macro, hãy xem cách upert hoạt động

$recipe->ingredients[]->createMany[[
['name' => 'Pecorino cheese'],
['name' => 'Spaghetti'],
['name' => 'Pancetta'],
['name' => 'Cream'],
]];
2

Đối số đầu tiên chứa tất cả các giá trị thành phần [lưu ý rằng chúng ta phải bao gồm khóa ngoại

$recipe->ingredients[]->createMany[[
['name' => 'Pecorino cheese'],
['name' => 'Spaghetti'],
['name' => 'Pancetta'],
['name' => 'Cream'],
]];
9 theo cách thủ công]. Đối số thứ hai liệt kê [các] cột xác định duy nhất các bản ghi [trong trường hợp này, chúng tôi sử dụng
# First request
recipe:
title: Spaghetti carbonara
ingredients:
- name: Pecorino cheese
- name: Spaghetti
- name: Pancetta
- name: Cream # Missing in second request

# Second request
recipe:
title: Spaghetti carbonara
ingredients:
- id: 1
name: Pecorino cheese
- id: 2
name: Spaghetti
- id: 3
name: Guanciale # Changed
- name: Salt & pepper # New
- name: Eggs # New
0]

ℹ️ Chúng ta có thể thêm đối số thứ ba để cung cấp một mảng có các cột sẽ được cập nhật khi tìm thấy bản ghi phù hợp. Trong trường hợp của chúng tôi, tất cả chúng đều có thể được cập nhật, vì vậy chúng tôi có thể bỏ qua đối số này

Để xóa các thành phần còn thiếu, chúng ta có thể sử dụng

# First request
recipe:
title: Spaghetti carbonara
ingredients:
- name: Pecorino cheese
- name: Spaghetti
- name: Pancetta
- name: Cream # Missing in second request

# Second request
recipe:
title: Spaghetti carbonara
ingredients:
- id: 1
name: Pecorino cheese
- id: 2
name: Spaghetti
- id: 3
name: Guanciale # Changed
- name: Salt & pepper # New
- name: Eggs # New
1 kết hợp với
# First request
recipe:
title: Spaghetti carbonara
ingredients:
- name: Pecorino cheese
- name: Spaghetti
- name: Pancetta
- name: Cream # Missing in second request

# Second request
recipe:
title: Spaghetti carbonara
ingredients:
- id: 1
name: Pecorino cheese
- id: 2
name: Spaghetti
- id: 3
name: Guanciale # Changed
- name: Salt & pepper # New
- name: Eggs # New
2. Việc xóa phải xảy ra trước khi upsert, nếu không các bản ghi mới được thêm vào cũng sẽ bị xóa

$recipe->ingredients[]->createMany[[
['name' => 'Pecorino cheese'],
['name' => 'Spaghetti'],
['name' => 'Pancetta'],
['name' => 'Cream'],
]];
7

Bây giờ hãy kết hợp mọi thứ chúng ta đã học vào một macro

Hãy định nghĩa một macro trong phương thức

# First request
recipe:
title: Spaghetti carbonara
ingredients:
- name: Pecorino cheese
- name: Spaghetti
- name: Pancetta
- name: Cream # Missing in second request

# Second request
recipe:
title: Spaghetti carbonara
ingredients:
- id: 1
name: Pecorino cheese
- id: 2
name: Spaghetti
- id: 3
name: Guanciale # Changed
- name: Salt & pepper # New
- name: Eggs # New
3
# First request
recipe:
title: Spaghetti carbonara
ingredients:
- name: Pecorino cheese
- name: Spaghetti
- name: Pancetta
- name: Cream # Missing in second request

# Second request
recipe:
title: Spaghetti carbonara
ingredients:
- id: 1
name: Pecorino cheese
- id: 2
name: Spaghetti
- id: 3
name: Guanciale # Changed
- name: Salt & pepper # New
- name: Eggs # New
4. Tên của macro sẽ là
# First request
recipe:
title: Spaghetti carbonara
ingredients:
- name: Pecorino cheese
- name: Spaghetti
- name: Pancetta
- name: Cream # Missing in second request

# Second request
recipe:
title: Spaghetti carbonara
ingredients:
- id: 1
name: Pecorino cheese
- id: 2
name: Spaghetti
- id: 3
name: Guanciale # Changed
- name: Salt & pepper # New
- name: Eggs # New
5 và nó sẽ chấp nhận
# First request
recipe:
title: Spaghetti carbonara
ingredients:
- name: Pecorino cheese
- name: Spaghetti
- name: Pancetta
- name: Cream # Missing in second request

# Second request
recipe:
title: Spaghetti carbonara
ingredients:
- id: 1
name: Pecorino cheese
- id: 2
name: Spaghetti
- id: 3
name: Guanciale # Changed
- name: Salt & pepper # New
- name: Eggs # New
6. Một iterable có thể là một mảng hoặc thậm chí là một bộ sưu tập Laravel

$recipe->ingredients[]->createMany[[
['name' => 'Pecorino cheese'],
['name' => 'Spaghetti'],
['name' => 'Pancetta'],
['name' => 'Cream'],
]];
2

Laravel tự động liên kết

# First request
recipe:
title: Spaghetti carbonara
ingredients:
- name: Pecorino cheese
- name: Spaghetti
- name: Pancetta
- name: Cream # Missing in second request

# Second request
recipe:
title: Spaghetti carbonara
ingredients:
- id: 1
name: Pecorino cheese
- id: 2
name: Spaghetti
- id: 3
name: Guanciale # Changed
- name: Salt & pepper # New
- name: Eggs # New
7 với phiên bản
# First request
recipe:
title: Spaghetti carbonara
ingredients:
- name: Pecorino cheese
- name: Spaghetti
- name: Pancetta
- name: Cream # Missing in second request

# Second request
recipe:
title: Spaghetti carbonara
ingredients:
- id: 1
name: Pecorino cheese
- id: 2
name: Spaghetti
- id: 3
name: Guanciale # Changed
- name: Salt & pepper # New
- name: Eggs # New
8. Chúng tôi sẽ sử dụng bản ghi đó cùng với các bản ghi để tạo một phiên bản của lớp macro của chúng tôi. Chúng ta có thể gọi thể hiện của
# First request
recipe:
title: Spaghetti carbonara
ingredients:
- name: Pecorino cheese
- name: Spaghetti
- name: Pancetta
- name: Cream # Missing in second request

# Second request
recipe:
title: Spaghetti carbonara
ingredients:
- id: 1
name: Pecorino cheese
- id: 2
name: Spaghetti
- id: 3
name: Guanciale # Changed
- name: Salt & pepper # New
- name: Eggs # New
9 giống như một hàm, vì chúng ta sẽ làm cho nó trở nên bất khả xâm phạm

Trước tiên, hãy đảm bảo rằng các bản ghi [thành phần] thực sự thuộc về mô hình gốc [công thức]. Chúng tôi không muốn mọi người lướt qua id mà họ không có quyền truy cập [cảm ơn Marek đã chú ý đến điều này]. Chúng tôi sẽ lọc ra các bản ghi không mong muốn trong hàm tạo

$recipe->ingredients[]->createMany[[
['name' => 'Pecorino cheese'],
['name' => 'Spaghetti'],
['name' => 'Pancetta'],
['name' => 'Cream'],
]];
6

Trong phương thức

$recipe->ingredients[]->createMany[[
['name' => 'Pecorino cheese'],
['name' => 'Spaghetti'],
['name' => 'Pancetta'],
['name' => 'Cream'],
]];
20, chúng tôi gói các phương thức xóa và nâng cấp trong một giao dịch. Hoặc là mọi thứ đều thất bại, hoặc mọi thứ đều thành công. Và như đã đề cập trước đây, chúng tôi thực hiện xóa trước khi upsert

$recipe->ingredients[]->createMany[[
['name' => 'Pecorino cheese'],
['name' => 'Spaghetti'],
['name' => 'Pancetta'],
['name' => 'Cream'],
]];
8

Việc triển khai

$recipe->ingredients[]->createMany[[
['name' => 'Pecorino cheese'],
['name' => 'Spaghetti'],
['name' => 'Pancetta'],
['name' => 'Cream'],
]];
21 khá giống với những gì chúng ta đã thấy trước đây, nhưng có một số điểm khác biệt. Thay vì mã hóa cứng
# First request
recipe:
title: Spaghetti carbonara
ingredients:
- name: Pecorino cheese
- name: Spaghetti
- name: Pancetta
- name: Cream # Missing in second request

# Second request
recipe:
title: Spaghetti carbonara
ingredients:
- id: 1
name: Pecorino cheese
- id: 2
name: Spaghetti
- id: 3
name: Guanciale # Changed
- name: Salt & pepper # New
- name: Eggs # New
0, chúng tôi lấy tên khóa từ bảng liên quan [thành phần]. Khi chúng tôi có tên khóa, chúng tôi có thể lấy id và lọc ra bất kỳ giá trị trống nào

$recipe
->ingredients[]
->createUpdateOrDelete[$data];
1

Việc xóa sau đó được thực hiện trên một bản sao của truy vấn. Bản sao là cần thiết vì nếu không thì mệnh đề

# First request
recipe:
title: Spaghetti carbonara
ingredients:
- name: Pecorino cheese
- name: Spaghetti
- name: Pancetta
- name: Cream # Missing in second request

# Second request
recipe:
title: Spaghetti carbonara
ingredients:
- id: 1
name: Pecorino cheese
- id: 2
name: Spaghetti
- id: 3
name: Guanciale # Changed
- name: Salt & pepper # New
- name: Eggs # New
1 sẽ vẫn xuất hiện trong truy vấn khi chúng tôi sử dụng nó để cập nhật

Trong

$recipe->ingredients[]->createMany[[
['name' => 'Pecorino cheese'],
['name' => 'Spaghetti'],
['name' => 'Pancetta'],
['name' => 'Cream'],
]];
24, chúng tôi ánh xạ các bản ghi và thêm khóa ngoại. Chúng tôi cũng đảm bảo rằng
# First request
recipe:
title: Spaghetti carbonara
ingredients:
- name: Pecorino cheese
- name: Spaghetti
- name: Pancetta
- name: Cream # Missing in second request

# Second request
recipe:
title: Spaghetti carbonara
ingredients:
- id: 1
name: Pecorino cheese
- id: 2
name: Spaghetti
- id: 3
name: Guanciale # Changed
- name: Salt & pepper # New
- name: Eggs # New
0 luôn hiện diện, ngay cả đối với các bản ghi mới [
$recipe->ingredients[]->createMany[[
['name' => 'Pecorino cheese'],
['name' => 'Spaghetti'],
['name' => 'Pancetta'],
['name' => 'Cream'],
]];
26]. Điều này là cần thiết để
$recipe->ingredients[]->createMany[[
['name' => 'Pecorino cheese'],
['name' => 'Spaghetti'],
['name' => 'Pancetta'],
['name' => 'Cream'],
]];
4 hoạt động chính xác

$recipe
->ingredients[]
->createUpdateOrDelete[$data];
7

Một số người có thể thích

$recipe->ingredients[]->createMany[[
['name' => 'Pecorino cheese'],
['name' => 'Spaghetti'],
['name' => 'Pancetta'],
['name' => 'Cream'],
]];
3 hơn
$recipe->ingredients[]->createMany[[
['name' => 'Pecorino cheese'],
['name' => 'Spaghetti'],
['name' => 'Pancetta'],
['name' => 'Cream'],
]];
4, những người khác có thể đang sử dụng UUID. Tuy nhiên, bây giờ bạn đã có tất cả kiến ​​thức cần thiết để sử dụng macro này hoặc một biến thể phù hợp nhất với tình huống của bạn

Làm cách nào để xóa dữ liệu quan hệ trong Laravel?

Để xóa một mô hình trực tiếp, gọi hàm delete[] trên mô hình đó và không xác định trình nghe xóa trong phương thức khởi động của mô hình hoặc xác định một phương thức xóa trống. If you want to further delete relations of a related model, you will define a deleting listener in the boot method of that model and delete the relations there.

Làm cách nào để xóa cứng các bản ghi trong Laravel?

Bạn có thể xóa vĩnh viễn một bản ghi khỏi cơ sở dữ liệu bằng phương thức forceDelete. Người dùng. first[]->forceDelete[]; Nếu bạn muốn dọn dẹp cơ sở dữ liệu của mình thường xuyên và tự động xóa các mô hình đã xóa mềm, điều này được gọi là cắt tỉa.

Làm cách nào để xóa nhiều dữ liệu trong Laravel?

Bạn có thể sử dụng phương thức destroyMultiple và chuyển một hoặc nhiều khóa chính cho phương thức đó dưới dạng yêu cầu biểu mẫu . Bạn cũng có thể sử dụng tùy chọn này để xóa các bản ghi có thông số tùy chỉnh. Bưu kiện. trong đó ['tiêu đề', 'Laravel']-> xóa[]; .

Làm cách nào để xóa tất cả dữ liệu khỏi bảng trong Laravel?

Bản ghi của chúng tôi sẽ tự động bị xóa khỏi bộ đệm nếu người dùng xóa tất cả bản ghi khỏi bảng. Nhưng chúng ta chỉ có thể xóa nó khỏi bộ đệm nếu chúng ta đang sử dụng mô hình của Laravel Eloquent. Trong ví dụ đầu tiên, chúng ta sẽ sử dụng hàm truncate[] , được sử dụng để xóa tất cả các bản ghi.

Chủ Đề