首页 > 解决方案 > Livewire - 我只能将记录添加到数据透视表 - 通过复选框

问题描述

我只能将记录添加到数据透视表。真的很难从数据透视表中删除一个条目

活线组件

<?php

namespace App\Http\Livewire;

use App\Models\User;
use App\Models\Company;
use Livewire\Component;
use Livewire\WithPagination;

class UserAssignCompanySection extends Component
{
    use WithPagination;

    public $sortBy = 'id';
    public $sortAsc = false;
    public $user;
    public $companies;
    public $search;
    public $confirmingCompanyRemoval = false;
    public $userCompanies = [];

    protected $rules = [
        'user.name' => 'required',
        'user.email' => 'required',
        'user.title' => 'required',
        'user.first_name' => 'required',
        'user.last_name' => 'nullable',
        'user.mobile' => 'nullable',
        'user.phone' => 'nullable',
        'user.is_customer' => 'boolean',
        'user.is_provider' => 'boolean',
        'userCompanies' => 'required|array',
    ];

    // Table Sort
    public function sortBy($field)
    {
        if($field == $this->sortBy){
            $this->sortAsc = !$this->sortAsc;
        }
         $this->sortBy = $field;
    }


    // public function updatedUserCompanies()
    // {

    //     $var1 = array_diff(Company::pluck('id')->toArray(),$this->userCompanies);

    //     dd(Company::pluck('id')->toArray(), $this->userCompanies);
    //     dd($var1);
    //     $this->user->companies()->sync($this->userCompanies);
    // }

    public function updatedUserCompanies()
    {
        //dd($this->userCompanies);
        $this->user->companies()->sync($this->userCompanies);

    }

    public function mount(User $user)
    {
        $this->user = $user;
        $this->companies = Company::all();
        $this->userCompanies = $user->companies()->pluck('company_id')->toArray();
        //dd($this->userCompanies);
    }

    public function render()
    {
        //$this->user->companies()->sync($this->userCompanies);
        return view('livewire.user-assign-company-section');
    }
}


<div>
    <div class="grid grid-cols-1 text-left xl:grid-cols-6">
        <div class="col-span-3 p-4">
            <p class="text-lg underline">Name</p>
            <x-jet-input wire:model.defer="user.name" id="name" type="text" disabled class="block w-full mt-1 bg-gray-100" />
            <x-jet-input-error for="user.name" class="mt-2" />
            <br>

            @json($userCompanies);


            {{-- @foreach ($userCompanies as $item)
                {{ $item }}
            @endforeach --}}

            @foreach($companies as $company)
            <div class="mt-1">
                <input wire:model="userCompanies" type="checkbox" value="{{ $company->id }}">
                    {{ $company->name }} <br>
            </div>
            @endforeach
            <br>
            {{-- <a href="{{ url()->previous() }}"><x-jet-button>Back</x-jet-button></a> --}}
            <br>
        </div>
    </div>
</div>

当我单击company_id = 3的复选框时,一个刺被添加到 $this->userCompanies livewire 属性

像这样的东西

[1,2,"3"];

当我取消选中 1 和 2 等 id 时(通过数据库检索的不会被删除)

我认为它试图从基于整数的数组中删除字符串,例如“1”

标签: laravellaravel-livewire

解决方案


如果属性是数组,则必须将模型声明为数组(使用点表示法)。试试这样的:

@foreach($companies as $i => $company)
<div class="mt-1">
  <input wire:model="userCompanies.$i" type="checkbox" value="{{$company->id }}">
      {{ $company->name }} <br>
</div>
@endforeach

推荐阅读