Trong bộ điều khiển Hóa đơn sau khi lưu Hóa đơn, bạn nên sử dụng mối quan hệ Nhiều đến Nhiều để
$user = Auth::user[];
$key = $request->input['key'];
$extra_column = $request->input['extra_column'];
if [count[$user->groups[]->where['key', $key]->where['extra_column', $extra_column]->first[]]]{
// fails [data exists already]
}else{
//update pivot
$user->groups[]->updateExistingPivot[$key, ['extra_column' => $extra_column]];
}
2 mục cho hóa đơn, đây là cách bạn thực hiệnpublic function store[Request $request]
{ $invoice = Invoice::create[[
'invoice_no' => 'invoice',
'invoice_date'=> $request->input['invoice_date'],
'due_date'=> $request->input['due_date'],
'customer_id'=> $request->input['customer_id'],
'sub_total' => $request->input['sub_total'],
'discount' => $request->input['discount'],
'total' => $request->input['total']
]];
$item = Item::findOrFail[$request->get['item_id']];
$item->invoices[]->attach[$invoice->primary_key, ['quantity' =>$request->get['quantity']]];
return redirect['/invoices'];
}
// đây là những gì làm việc cho tôi
$user = Auth::user[];
$key = $request->input['key'];
$extra_column = $request->input['extra_column'];
if [count[$user->groups[]->where['key', $key]->where['extra_column', $extra_column]->first[]]]{
// fails [data exists already]
}else{
//update pivot
$user->groups[]->updateExistingPivot[$key, ['extra_column' => $extra_column]];
}
QuickAdminPanel của chúng tôi có thuộc về trường quan hệToMany, nhưng chúng tôi không có khả năng thêm các cột bổ sung vào bảng tổng hợp. Đừng lo lắng, bài viết này sẽ chỉ cho bạn cách thực hiện thay đổi này theo cách thủ công hoặc triển khai nó trong dự án Laravel của bạn không được tạo bởi QuickAdminPanel
Hãy tưởng tượng một kịch bản. bạn có một trang web Công thức và mỗi Công thức có thể bao gồm nhiều Thành phần, vì vậy bạn tạo mối quan hệ nhiều-nhiều và thêm các thành phần với menu thả xuống nhiều Select2 được tạo của chúng tôi
Nhưng sẽ hợp lý hơn khi thêm các thành phần với SỐ LƯỢNG của chúng, phải không? . Đối với điều đó, chúng tôi cần một trường bổ sung trong bảng tổng hợp component_recipe
Hãy thực hiện điều đó trong bài viết này, đồng thời thay đổi biểu mẫu để có thể chỉ định số lượng này. Đây là kết quả cuối cùng
Hoặc, nếu bạn thích một video demo
Vì vậy, hãy thực hiện thay đổi, từng bước một
Bước 1. Trường mới Số tiền. Di chuyển/Mô hình
Từ QuickAdminPanel được tạo mặc định, chúng tôi có cấu trúc này
ứng dụng/Mô hình/Công thức. php
public function ingredients[] { return $this->belongsToMany[Ingredient::class]; }
Hãy thêm trường số tiền vào đây
php artisan make:migration add_amount_to_ingredient_recipe_table
Và trong cuộc di cư
public function up[] { Schema::table['ingredient_recipe', function [Blueprint $table] { $table->string['amount']; }]; }
Và sau đó chúng ta cần chỉ định nó trong app/Models/Recipe. php
public function ingredients[] { return $this->belongsToMany[Ingredient::class]->withPivot['amount']; }
Bạn có thể đọc thêm về những thay đổi Eloquent đó trong tài liệu chính thức của Laravel
Bước 2. Lưỡi dao + Bộ điều khiển. Tạo/Chỉnh sửa Biểu mẫu
Trong bộ điều khiển, chúng ta cần truyền Thành phần trong phương thức tạo []
public function create[] { return view['admin.recipes.create', [ 'ingredients' => Ingredient::all[], ]]; }
Và sau đó trong tài nguyên/lượt xem/quản trị viên/công thức nấu ăn/tạo. lưỡi. php, thay vì trường Select2 đó, chúng tôi sẽ tạo một phần phiến sẽ được sử dụng lại trong chế độ xem Tạo và Lưu trữ. Vì vậy, phần này sẽ giống hệt nhau trong công thức nấu ăn/tạo. lưỡi. php và công thức nấu ăn/chỉnh sửa. lưỡi. php
{{ trans['cruds.recipe.fields.ingredients'] }} @include['admin.recipes.partials.ingredients'] @if[$errors->has['ingredients']]{{ $errors->first['ingredients'] }}@endif {{ trans['cruds.recipe.fields.ingredients_helper'] }}
Bây giờ, những gì bên trong tài nguyên/lượt xem/quản trị viên/công thức/bộ phận/thành phần đó. lưỡi. php?
________số 8Vì vậy, chúng tôi đang tải $ingredients dưới dạng bảng, kiểm tra xem mỗi số tiền có giá trị hay được đặt thành null hay không và liệu chúng tôi có cần tắt đầu vào đó không
Ngoài ra, có một phần @['scripts'] thêm đoạn mã jQuery để bật/tắt trường số lượng trên hàng, nếu hộp kiểm của thành phần nào đó được đánh dấu
Bây giờ, chúng ta lấy $ingredient->value đó ở đâu?
public function edit[Recipe $recipe] { abort_if[Gate::denies['recipe_edit'], Response::HTTP_FORBIDDEN, '403 Forbidden']; $recipe->load['ingredients']; $ingredients = Ingredient::get[]->map[function[$ingredient] use [$recipe] { $ingredient->value = data_get[$recipe->ingredients->firstWhere['id', $ingredient->id], 'pivot.amount'] ?? null; return $ingredient; }]; return view['admin.recipes.edit', [ 'ingredients' => $ingredients, 'recipe' => $recipe, ]]; }
Như bạn có thể thấy, chúng ta đang sử dụng method map[] của Collection và sau đó lấy giá trị từ pivot. cơ cấu số lượng
Bước 3. Xác thực/Lưu thành phần
Đầu tiên, thay đổi nhỏ từ mã của QuickAdminPanel mặc định. chúng ta cần thay đổi quy tắc xác thực. từ số nguyên sang chuỗi ở đây, vì số tiền của chúng tôi là chuỗi
ứng dụng/Http/Yêu cầu/StoreRecipeRequest. php và UpdateRecipeRequest giống hệt nhau. php
$user = Auth::user[];
$key = $request->input['key'];
$extra_column = $request->input['extra_column'];
if [count[$user->groups[]->where['key', $key]->where['extra_column', $extra_column]->first[]]]{
// fails [data exists already]
}else{
//update pivot
$user->groups[]->updateExistingPivot[$key, ['extra_column' => $extra_column]];
}
0Cuối cùng, cách chúng tôi lưu trữ và cập nhật dữ liệu, trong RecipesController
$user = Auth::user[];
$key = $request->input['key'];
$extra_column = $request->input['extra_column'];
if [count[$user->groups[]->where['key', $key]->where['extra_column', $extra_column]->first[]]]{
// fails [data exists already]
}else{
//update pivot
$user->groups[]->updateExistingPivot[$key, ['extra_column' => $extra_column]];
}
1Một lần nữa, một số "ma thuật" của Bộ sưu tập trong phương thức mapIngredients để làm cho các phương thức lưu trữ/cập nhật trở nên dễ đọc hơn và ngắn hơn