SQLSTATE[23000]:livewire 中的完整性约束违规

时间:2021-06-09 10:24:56

标签: laravel laravel-livewire

在 Livewire 组件中,我在模态中有一个表单来编辑信息。 当我单击按钮时,模态将打开并显示输入中的项目信息。 问题是,如果一个或所有输入没有更改它们的值并且单击编辑按钮,则会出现以下错误,表示值为空!!。并且必须更改输入,以免出现错误

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'network' cannot be null (SQL: update `networks` set `network` = ?, `networkName` = ?, `address` = ?, `address_regex` = ?, `tag_memo` = ?, `tag_regex` = ?, `min_withdraw` = ?, `max_withdraw` = ?, `fee` = ?, `deposit` = inactive, `withdraw` = inactive, `networks`.`updated_at` = 2021-06-09 10:18:52 where `id` = 8)

组件代码:

<?php

namespace App\Http\Livewire\Backend\Currency;

use App\Models\Network;
use Livewire\Component;

class Networks extends Component
{

    protected $listeners = ['refreshNetwork' => '$refresh'];
    public $confirming;
    public $editId;
    public $networkEdit;
    public $networkNameEdit;
    public $address_networkEdit;
    public $address_regexEdit;
    public $tag_memo_networkEdit;
    public $tag_regexEdit;
    public $min_withdrawEdit;
    public $max_withdrawEdit;
    public $feeEdit;
    public $depositEdit = false;
    public $withdrawEdit = false;
    
    public function editForm($id,$action)
    {
        if ($network = Network::where('id' , $id)->first()) {
            $this->editId = $id;

            $this->dispatchBrowserEvent('editNetworkModal', $networkData = [
                'network' => $network->network,
                'networkName' => $network->networkName,
                'address_network' => $network->address,
                'address_regex' => $network->address_regex,
                'tag_memo_network' => $network->tag_memo_network,
                'tag_memo_regex' => $network->tag_memo_regex,
                'min_withdraw' => $network->min_withdraw,
                'max_withdraw' => $network->max_withdraw,
                'fee' => $network->fee ,
                'deposit' => $network->deposit,
                'withdraw' => $network->withdraw,
            ]);
        }else{
            $this->alert('warning', 'شبکه مورد نظر پیدا نشد !', [
                'position' =>  'center',
                'timer' =>  2000,
                'toast' =>  false,
                'text' =>  '',
                'confirmButtonText' =>  'خب',
                'cancelButtonText' =>  'خب',
                'showCancelButton' =>  false,
                'showConfirmButton' =>  false,
            ]);
        }


    }
    
    public function Update($action)
    {
        if ($action == 'edit')
        {
            Network::where('id' , $this->editId)->update([
                'network' => $this->networkEdit,
                'networkName' => $this->networkNameEdit,
                'address' => $this->address_networkEdit,
                'address_regex' => $this->address_regexEdit,
                'tag_memo' => $this->tag_memo_networkEdit,
                'tag_regex' => $this->tag_regexEdit,
                'min_withdraw' => $this->min_withdrawEdit,
                'max_withdraw' => $this->max_withdrawEdit,
                'fee' => $this->feeEdit,
                'deposit' => $this->depositEdit == false ? 'inactive' : 'active',
                'withdraw' => $this->withdrawEdit== false ? 'inactive' : 'active',
            ]);
            $this->emit('refreshNetwork');
            $this->dispatchBrowserEvent('hideEditNetworkModal');
            $this->alert('success', 'شبکه با موفقیت ویرایش شد.', [
                'position' =>  'center',
                'timer' =>  2000,
                'toast' =>  false,
                'text' =>  '',
                'confirmButtonText' =>  'خب',
                'cancelButtonText' =>  'خب',
                'showCancelButton' =>  false,
                'showConfirmButton' =>  false,
            ]);
        }
    }


    public function render()
    {
        return view('livewire.backend.currency.networks');
    }
}

模态:

    <div  wire:key="B" class="modal fade" tabindex="-1" id="editNetworkModal">
        <div class="modal-dialog modal-lg" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title">ویرایـش شبکـه انتقال</h5>
                    <a href="#" class="close" data-dismiss="modal" aria-label="Close">
                        <em class="icon ni ni-cross"></em>
                    </a>
                </div>
                <div class="modal-body">
                    <form action="#" class="form-validate is-alter">
                        <div class="row gy-3">
                            <div class="col-md-6">
                                <div class="form-group">
                                    <label class="form-label" for="full-name">شبکه ارز</label>
                                    <div class="form-control-wrap">
                                        <input wire:model.defer="networkEdit" type="text" class="form-control" placeholder="مثال : BNB" id="networkEdit" required>
                                    </div>
                                </div>
                            </div>
                            <div class="col-md-6">
                                <div class="form-group">
                                    <label class="form-label" for="email-address">نام شبکه</label>
                                    <div class="form-control-wrap">
                                        <input wire:model="networkNameEdit" id="networkNameEdit" type="text" class="form-control" placeholder="مثال: BEP20" required>
                                    </div>
                                </div>
                            </div>
                            <div class="col-md-6">
                                <div class="form-group">
                                    <label class="form-label" for="phone-no">ادرس</label>
                                    <div class="form-control-wrap">
                                        <input wire:model="address_networkEdit" type="text" class="form-control"  id="address_networkEdit">
                                    </div>
                                </div>
                            </div>
                            <div class="col-md-6">
                                <div class="form-group">
                                    <label class="form-label" for="phone-no">اعتبار سنجی آدرس شبکه به وسیله عبارات منظم</label>
                                    <div class="form-control-wrap">
                                        <input wire:model="address_regexEdit" type="text" class="form-control" id="address_regexEdit">
                                    </div>
                                </div>
                            </div>
                            <div class="col-md-6">
                                <div class="form-group">
                                    <label class="form-label" for="phone-no">آدرس Memo یا Tag</label>
                                    <div class="form-control-wrap">
                                        <input wire:model="tag_memo_networkEdit" type="text" class="form-control" id="tag_memo_networkEdit">
                                    </div>
                                </div>
                            </div>
                            <div class="col-md-6">
                                <div class="form-group">
                                    <label class="form-label" for="phone-no">اعتبار سنجی Memo شبکه به وسیله عبارات منظم</label>
                                    <div class="form-control-wrap">
                                        <input wire:model="tag_regexEdit" type="text" class="form-control" id="tag_regexEdit">
                                    </div>
                                </div>
                            </div>
                            <div class="col-md-4">
                                <div class="form-group">
                                    <label class="form-label" for="phone-no">حداقل برداشت</label>
                                    <div class="form-control-wrap">
                                        <input wire:model="min_withdrawEdit" type="text" class="form-control" id="min_withdrawEdit">
                                    </div>
                                </div>
                            </div>
                            <div class="col-md-4">
                                <div class="form-group">
                                    <label class="form-label" for="phone-no">حداکثر برداشت</label>
                                    <div class="form-control-wrap">
                                        <input wire:model="max_withdrawEdit" type="text" class="form-control" id="max_withdrawEdit">
                                    </div>
                                </div>
                            </div>
                            <div class="col-md-4">
                                <div class="form-group">
                                    <label class="form-label" for="phone-no">کارمزد برداشت</label>
                                    <div class="form-control-wrap">
                                        <input wire:model="feeEdit" type="text" class="form-control" id="feeEdit">
                                    </div>
                                </div>
                            </div>
                            <div class="col-md-6">
                                <div class="form-group">
                                    <div class="custom-control custom-switch">
                                        <input wire:model="depositEdit" type="checkbox" class="custom-control-input" id="depositEdit">
                                        <label class="custom-control-label" for="deposit">واریـز به این آدرس</label>
                                    </div>
                                </div>
                            </div>
                            <div class="col-md-6">
                                <div class="form-group">
                                    <div class="custom-control custom-switch">
                                        <input wire:model.defer="withdrawEdit" type="checkbox" class="custom-control-input" id="withdrawEdit">
                                        <label class="custom-control-label" for="withdraw">برداشت به این آدرس</label>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </form>
                </div>
                <div class="modal-footer bg-light">
                    <button wire:click="Update('edit')" class="btn btn-round btn-outline-primary ">
                        <div wire:loading wire:target="Update">
                            <span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
                        </div>
                        <span class="w-100px">ویرایـش شبکـه</span>
                    </button>
                    <button  data-dismiss="modal" aria-label="Close" class="btn btn-round btn-outline-secondary w-90px"><span>بستن</span></button>
                </div>
            </div>
        </div>
    </div>

和用于设置输入值和打开模态的js代码:

    window.addEventListener('editNetworkModal', event => {
        $("#editNetworkModal").modal('show');
        $('#networkEdit').val(event.detail.network);
        $('#networkNameEdit').val(event.detail.networkName);
        $('#address_networkEdit').val(event.detail.address_network);
        $('#address_regexEdit').val(event.detail.address_regex);
        $('#tag_memo_networkEdit').val(event.detail.tag_memo_network);
        $('#tag_regexEdit').val(event.detail.tag_regex);
        $('#min_withdrawEdit').val(event.detail.min_withdraw);
        $('#max_withdrawEdit').val(event.detail.max_withdraw);
        $('#feeEdit').val(event.detail.fee);
        $('#depositEdit').val(event.detail.deposit);
        $('#withdraw').val(event.detail.withdraw);
        console.log(event.detail)
    });

1 个答案:

答案 0 :(得分:1)

 $this->dispatchBrowserEvent('editNetworkModal', $networkData = [
         'network' => $network->network,

Livewire 的目标之一,就是在这类事情上忘掉 JS。用 wire:model 绑定属性你根本不需要使用 JS,甚至通过事件传递这个 db 信息。使用从数据库检索数据并将其分配给公共属性的简单方法就足以让您在前端获得此

public function editForm($id,$action)
{
  $this->getModelData($id);
  $this->dispatchBrowserEvent('openEditModal');
} 
public function getModelData($modelId)
{
   $model = Model::find($modelId);
   $this->property1 = $model->property1;
   //......
}