【问题标题】:Edit table with many to many relationship in Laravel在 Laravel 中编辑具有多对多关系的表
【发布时间】:2019-09-15 19:53:28
【问题描述】:

我在更新由多对多关系产生的桥接表时遇到问题,如果我选择一门新课程,它会毫无问题地添加它,但如果我未选中任何课程,它不会删除它,我该如何继续?

这是表格

<div class="container">
  <div class="row">
    <div class="col-lg-12">
      <form class="form-group" action="{{route('trainers.update', $trainer->id)}}" method="post" enctype="multipart/form-data">
          @csrf
          @method('PUT')

          <div class="form-group">
            <label for="name">Nome</label>
            <input type="text" class="form-control" name="name" value="{{$trainer->name}}">
          </div>

          <div class="form-group">
            <label for="surname">Cognome</label>
            <input type="text" class="form-control" name="surname" value="{{$trainer->surname}}">
          </div>

          <div class="form-group">
            <label for="description">Descrizione</label>
            <textarea class="form-control" name="description" rows="8" cols="80">{!! $trainer->description !!}</textarea>
          </div>

          @foreach ($courses as $course)
            <div class="form-check form-check-inline mb-2">
              <input name="course_id[]" class="form-check-input" type="checkbox" value="{{$course->id}}">
              <label class="form-check-label" for="course_id">{{$course->name_course}}</label>
            </div>
          @endforeach

          <div class="form-group">
            <img src="{{asset('storage/'.$trainer->image)}}" alt="">
          </div>

          <div class="custom-file">
            <input type="file" class="custom-file-input" name="image">
            <label class="custom-file-label" for="image">Scegli un'immagine</label>
            <div class="invalid-feedback"><strong>N.B.</strong> dimensione consigliata 160px x 160px</div>
          </div>

          <div class="form-group">
            <input type="submit" class="form-control" value="MODIFICA ISTRUTTORE">
          </div>
        </form>
    </div>
  </div>
</div>

这是控制器中的编辑功能

    public function edit($id)
    {
        $trainer = Trainer::find($id);
        $courses = Course::all();
        return view('trainers.edit', compact('trainer','courses'));
    }

这是控制器中的更新函数

    public function update(Request $request, Trainer $trainer)
    {
      $data = $request->all();

      $trainer->update($data);

      $trainer->courses()->detach($data['course_id']);
      $trainer->courses()->attach($data['course_id']);

      return redirect()->route('trainers.admin');
    }

【问题讨论】:

    标签: php mysql laravel foreign-keys many-to-many


    【解决方案1】:

    试试这个

    public function edit($id)
    {
        $trainer = Trainer::find($id);
        $courses = Course::where('active', 1)->get(); //assume active is there in courses table (or any other column)
    
        // $trainer->courses - retrive trainer courses
        return view('trainers.edit', compact('trainer','courses'));
    }
    
    public function update(Request $request, Trainer $trainer)
    {
          $data = $request->all();
          $trainer->update($data);
    
          $trainer->courses()->sync($data['course_id']);
    
          return redirect()->route('trainers.admin');
    }
    

    sync 方法接受要放置在中间表上的 ID 数组。

    更多信息请阅读:Syncing Associations

    你也可以参考以上链接Filtering Relationships Via Intermediate Table Columns

    【讨论】:

    • @amepro 很高兴为您提供帮助。如果你愿意,你可以接受作为答案。以便其他开发人员轻松找到答案
    • 我已经接受你的回答,还有一个问题,我如何查看活动课程?否则我无法记住它们或每次编辑培训师时都选择它们
    • 您能否对此进行更多解释,或者您也可以更新问题。您可以在 courses 表中设置 active 标志。如果我误解了您的问题,请告诉我
    • 在前端编辑一位培训师时,我希望已经激活的课程带有标志
    • 我没有活动列,在我的中间表中有 id - trainer_id - course_id
    猜你喜欢
    • 2016-08-25
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多