【问题标题】:Trying to make select option to work in livewire试图使选择选项在 livewire 中工作
【发布时间】:2021-06-25 02:22:49
【问题描述】:

当我尝试使用 Laravel Livewire 提交所选选项时出现此错误。

照亮\数据库\查询异常 SQLSTATE[23000]:完整性约束违规:1048 列'team_id'不能为空(SQL:插入projects(user_id,name,description,team_id,updated_at,created_at)值 (1, Sammy Mwangangi, qdqwfdweqfc wqdqwfdwqdqwdwq, ?, 2021-06-24 13:39:14, 2021-06-24 13:39:14))

App\Models\Project.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Project extends Model
{
    use HasFactory;

    protected $fillable = [
        'name',
        'description',
        'team_id',
    ];

    // protected $guarded = [];

    public function tasks(){
        return $this->hasMany(Task::class);
    }

    public function user(){
        return $this->belongsTo(User::class);
    }

    public function team(){
        return $this->belongsTo(Team::class);
    }
}

App\Http\Livewire\Project.php

<?php

namespace App\Http\Livewire;

use Livewire\Component;
use App\Models\Project;
use App\Models\Team;
use Livewire\WithPagination;
use Illuminate\Support\Str;
use Auth;

class Projects extends Component
{
    use WithPagination;

    public $name;
    public $description;
    public $team_id;
    public $projectId = null;
    
    public $showModalForm = false;

    public function showCreateProjectModal()
    {
        $this->showModalForm = true;
    }

    public function updatedShowModalForm()
    {
        $this->reset();
    }

    public function storeProject()
    {
        $this->validate([
          'name' =>'required',
          'description'  => 'required',
      ]);

        $project =new Project();
        $project->user_id = auth()->user()->id;
        $project->name = $this->name;
        $project->description = $this->description;
        $project->team_id = $this->team_id;
        $project->save();
        $this->reset();
        session()->flash('flash.banner', 'Project created Successfully');
    }
    public function showEditProjectModal($id)
    {
        $this->reset();
        $this->showModalForm = true;
        $this->projectId = $id;
        $this->loadEditForm();
    }

    public function loadEditForm()
    {
        $project = Project::findOrFail($this->projectId);
        $this->name = $project->name;
        $this->description = $project->description;
    }

    public function updateProject()
    {
        $this->validate([
          'name' =>'required',
          'description'  => 'required',
      ]);

        Project::find($this->projectId)->update([
             'name' => $this->name,
             'description'  => $this->description
        ]);
        $this->reset();
        session()->flash('flash.banner', 'Project Updated Successfully');
    }

    public function deleteProject($id)
    {
        $project = Project::find($id);
        $project->delete();
        session()->flash('flash.banner', 'Project Deleted Successfully');
    }

    public function render()
    {
        return view('livewire.projects', [
            'projects' => Project::orderBy('created_at', 'DESC')->paginate(5),
            'teams' => Team::all()
        ]);
    }
}

projects.blade.php

        <div class="flex flex-wrap mb-6">
            <label for="team" class="block text-gray-700 dark:text-white text-sm font-bold mb-2">
              {{ __('Team') }}:
            </label>

            <select class="form-select px-4 py-3 w-full rounded" wire:model="team_id" name="team_id">
              @foreach($teams as $team)
                <option value="{{$team->id}}">{{$team->name}}</option>
              @endforeach
            </select>
            <p class="mt-2 text-sm text-gray-500">
              Select the team/department your project is associated with.
            </p>

            @error('team_id')
            <p class="text-red-500 text-xs italic mt-4">
              {{ $message }}
            </p>
            @enderror
          </div>

我错过了什么?关于模型关系以及如何在模型之间绑定数据,我在 livewire 方面做得不多。

【问题讨论】:

  • 只有在不更改默认选项时才会出现错误?如果是这样,可能是因为您没有为项目组件上的team_id 属性设置初始值。您可以直接在属性上执行此操作(例如public $team_id = 1;),也可以在组件上的mount() 方法中执行此操作。但是,如果即使您选择了不同的团队也会发生这种情况,我会首先验证 Livewire 是否正确读取了 team_id 的绑定值,可能通过在视图中的某处回显/转储出 team_id 并查看它是否在您更改所选选项时发生变化.

标签: laravel laravel-livewire


【解决方案1】:

你必须为选择做一个默认标签选项,这样在更改元素上这会将值绑定到属性

<select class="form-select px-4 py-3 w-full rounded" wire:model="team_id">
   <option>Select Team</option>
   @foreach($teams as $team)
     <option value="{{$team->id}}">{{$team->name}}</option>
   @endforeach
</select>

同样在验证规则中,您可以为提交时不能为空的“team_id”值添加另一个

【讨论】:

  • 或者,如果您想避免使用select team 选项,您可以将组件上的$team_id 属性预设为第一个team id(或任何其他id) .
【解决方案2】:

wire:model 应该在 option 标签上而不是 select

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 2011-12-15
    • 2021-07-24
    • 2021-08-22
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 2022-11-05
    • 1970-01-01
    相关资源
    最近更新 更多