如何从 laravel 中的中间表(多对多关系)中获取数据

Posted

技术标签:

【中文标题】如何从 laravel 中的中间表(多对多关系)中获取数据【英文标题】:How can i get data from intermediate table (many to many relationship) in laravel 【发布时间】:2019-09-16 08:16:12 【问题描述】:

我想阅读培训师和课程表之间的中间表的内容,以便能够标记给定培训师的活动课程的复选框,我该怎么做?

您可以在此处查看培训师表 http://prntscr.com/nhcrl4

您可以在此处查看课程表 http://prntscr.com/nhcrvp

您可以在这里查看 course_trainer(中级)表 http://prntscr.com/nhcsek

我想过用三元,你给我建议?

非常感谢

这是表格

<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)" >
          </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()->sync($data['course_id']);

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

【问题讨论】:

您可以为您的模型和关系表添加迁移代码吗? 如果你想访问数据透视表,你可以使用 Pivot() laravel.com/docs/5.8/… 我认为你想要实现的是 pivot-> trainer_id == $trainer->id) "checked='' " @endif value="$course->id"> @AhmedAboud 如果你看过course_trainer,你会注意到表结构不像 laravel 文档,所以不会像一个。 我在答案中添加模型,只需一分钟 【参考方案1】:

这是训练模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Trainer extends Model

    protected $fillable = ['name','surname','description','image'];

    public function courses()
      return $this->belongsToMany(Course::class)->withTimestamps();
    


这是课程模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Course extends Model

  protected $fillable = ['name_course','description_course','logo_course'];


  public function trainers()
    return $this->belongsToMany(Trainer::class)->withTimestamps();
  

【讨论】:

【参考方案2】:

这是训练模型

public function courses()
  return $this->belongsToMany('App\Course', 'course_trainer ', 'trainer_id', 'course_id')->withTimestamps();

这是课程模型

public function trainers()
  return $this->belongsToMany('App\Trainer', 'course_trainer ', 'course_id', 'trainer_id')->withTimestamps();

belongsToMany()方法4个参数,第一个是你要链接的模型的位置,第二个是数据透视表的名称,第三个是当前模型外键,第四个是其他模型外键键。

现在你可以在表单中做这样的事情

<input name="course_id[]" class="form-check-input" type="checkbox" @if($course->pivot->trainer_id == $trainer->id) "checked='' " @endif value="$course->id">

【讨论】:

【参考方案3】:

我在不改变模型的情况下解决了问题......这样做就足够了

          @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" @foreach ($trainer->courses as $value)
                ($course->id == $value->pivot->course_id) ? 'checked' : ''

              @endforeach>

              <label class="form-check-label" for="course_id">$course->name_course</label>

            </div>
          @endforeach

【讨论】:

以上是关于如何从 laravel 中的中间表(多对多关系)中获取数据的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 雄辩的关系 - 多对多 - 获取中间表列

与多个中间表的多对多 Laravel Eloquent 关系

如何在多对多关系 Laravel 中检索所有相关模型?

从laravel中的多对多关系中获取单列

如何在Laravel中的多对多关系中添加“别名”?

Laravel5.1 模型 --多对多关系