Laravel cập nhật trục bổ sung cột

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ện

public 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ố 8

Vì 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]];

    }
0

Cuố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]];

    }
1

Mộ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

Làm cách nào để cập nhật cột trụ trong Laravel?

Có nhiều cách để cập nhật bảng tổng hợp trong Laravel. Chúng ta có thể sử dụng thuộc tính attachment[], detach[], sync[] và pivot để cập nhật bảng trung gian trong Laravel.

Làm cách nào để lấy dữ liệu từ bảng tổng hợp trong Laravel?

Làm cách nào để lấy dữ liệu bảng tổng hợp trong Laravel 8? .
// Trong mô hình Người dùng. php, thêm vớiPivot;
chức năng công khai khách hàng[]{
trả về $this->belongsToMany['role']
->withPivot['loại'];
// sau đó truy cập trường bằng ->pivot;
$current_user->customer->pivot->type

Làm cách nào để tạo bảng tổng hợp trong Laravel?

Làm cách nào để tạo bảng tổng hợp Laravel? . Thuộc tính trục giao tiếp với bảng trung gian này trong bộ điều khiển hoặc mô hình trong Laravel. choose the intermediate table and it is called a pivot table in terms of Laravel. The pivot attribute communicates with this intermediate table in controllers or models in Laravel.

Bảng tổng hợp trong Laravel là gì?

Laravel Daily có một bài đăng mới về bảng tổng hợp và mối quan hệ nhiều-nhiều. Tôi muốn nói về một tính năng của Laravel, tính năng này thực sự hữu ích nhưng có thể khó hiểu lúc đầu. Bảng tổng hợp là một ví dụ về bảng trung gian có mối quan hệ giữa hai bảng "chính" khác

Chủ Đề