【问题标题】:Livewire multi select form dataLivewire 多选表单数据
【发布时间】:2021-10-31 03:22:06
【问题描述】:

我正在使用 laravel 8,需要从表单选择的数据中选择数据,并在我的 ServClinic 表上仅插入 Clinic_id 和 Service_id 这是我的模型 需要从多对多关系中保存数据并进一步获取数据 我的诊所模型

<?php
class Clinic extends Model
{
    use HasFactory;

    protected $table = "clinics";

    public function services(){
        return $this->belongsToMany(ServiceData::class,'serv_clinics');
    }
}

和 我的服务数据模型

<?php
class ServiceData extends Model
{
    use HasFactory;

    protected $tabel = "service_data";
    public function clinic(){
        return $this->belongsToMany(Clinic::class,'serv_clinics');
    }
}

和 服务诊所模型

<?php
class ServClinic extends Model
{
    use HasFactory;
    
    protected $tabel ="serv_clinics";
}

视图是

<main class="col-md-9 ms-sm-auto col-lg-10 px-md-4">
    <div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-4 pb-2 mb-3 border-bottom">
        <h1 class="h2">اضافة خدمة بالعيادة</h1>
    </div>

    @if(Session::has('message'))
        <div class="alert alert-success" role="alert">{{Session::get('message')}}</div>
    @endif                  
    <form class="form-horizontal" wire:submit.prevent="storeServices"> 
        <div class="form-group">
            <label class="col-md-4 control-label">اختار العيادة</label><br/>
            <div class="col-md-4" wire:ignore>
                <select class="sel_categories form-control" name="clinics[]">
                    @foreach($clinics as $clinic)
                        <option value="{{$clinic->id}}">{{$clinic->name}}</option>
                    @endforeach
                </select>
            </div>
        </div>
        <div class="form-group">
            <label class="col-md-4 control-label">اختارالخدمات</label><br/>
            <div class="col-md-4" wire:ignore>
                <select class="form-control" name="services[]" multiple="multiple">
                    @foreach($services as $service)
                        <option value="{{$service->id}}">{{$service->name}}</option>
                    @endforeach
                </select>
            </div>
        </div>
        <div class="form-group">
            <label class="col-md-4 control-label"></label>
            <div class="col-md-4">
                <button type="submit" class="btn btn-primary">حفظ</button>
            </div>
        </div>
    </form>
</main>

需要获取clinic_id和serve_id并保存在ServClinic表中 我的迁移文件是

public function up()
{
    Schema::create('serv_clinics', function (Blueprint $table) {
        $table->id();
        $table->bigInteger('clinic_id')->unsigned();
        $table->bigInteger('serve_id')->unsigned();
        $table->timestamps();
        $table->foreign('clinic_id')->references('id')->on('clinics')->onDelete('cascade');
        $table->foreign('serve_id')->references('id')->on('service_data')->onDelete('cascade');
    });
}

【问题讨论】:

    标签: php bootstrap-4 laravel-8 laravel-livewire


    【解决方案1】:

    如果您在 selec2 倍数元素中,我认为您首先必须获取此数据并获取要附加到服务的诊所模型的集合

    public $clinics = []; // or whatever is the property for clinics ids array
    public $services = []; // property of serviceData ids array
    
    public function storeServices()
    {
       $clinicCollection = Clinic::whereIn('id',$clinics)->get();
       foreach($clinicCollection as $clinic) {
          $clinic->attach($services);
       }
    }
    

    如果您遵循有关多对多中间表 (https://laravel.com/docs/8.x/eloquent-relationships#many-to-many) 的 Laravel 文档,您将看到不需要 ServClinics 模型。只为 Clinic_service_data 中间表创建迁移。

    当然,就我的观点而言,这是最简单的方法。现在,如果你继续你的解决方案,那么你可以这样做:

    public function storeServices()
    {
       $clinicCollection = Clinic::whereIn('id',$clinics)->get();
       $servDataCollection = Servicedata::whereIn('id',$services)->get();
       foreach($clinicCollection as $clinic) {
          foreach($servDataCollection as $servData) {
             ServClinic::create([
                 'clinic_id' => $clinic->id,
                 'serve_id' => $servData->id
             ]);
          }
       }
    }
    

    当然,您可以使用 foreach 语句过滤集合

    【讨论】:

    • 似乎 $clinicCollection 上的 $clinics = Clinic::whereIn('id',$clinics)->get();未定义
    • $clinics 是诊所选择元素的多个选定值的数组属性。你如何将它绑定到后端?任何JS代码?我假设这是 select2 元素
    • 是的,我正在使用 select2 并且有同样的错误
    • 你能把它的脚本标签贴出来吗?另外,在方法中执行 dd($clinics)
    • @push('scripts') @endpush 这是我的脚本标签
    猜你喜欢
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    相关资源
    最近更新 更多