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ầnLaravel 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'],
]];
3Trướ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'],
]];
7Bâ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'],
]];
2Laravel 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ạmTrướ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'],
]];
6Trong 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'],
]];
8Việ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];
1Việ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ậtTrong
$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];
7Mộ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