在 Laravel 中填充具有多对多关系的表

Posted

技术标签:

【中文标题】在 Laravel 中填充具有多对多关系的表【英文标题】:Populate table with many to many relationship in Laravel 【发布时间】:2019-09-14 23:50:28 【问题描述】:

我有 3 个表:培训师、课程、课程培训师

当我创建一个新的教练时,我必须将它所播放的课程链接到它,我怎样才能将刚刚创建的教练的 ID 和课程的 ID 传递给桥接表 course_trainer?

目前我只能为课程传递一个 id,但我无法传递培训师的 id,也无法为每个所选课程创建新记录(报告)


<div class="container">
  <div class="row">
    <div class="col-lg-12">
      <form class="form-group" action="route('trainers.store')" method="post" enctype="multipart/form-data">
          @csrf
          @method('POST')

          <div class="form-group">
            <label for="name">Nome</label>
            <input type="text" class="form-control" name="name" placeholder="Inserisci il nome dell'istruttore">
          </div>

          <div class="form-group">
            <label for="surname">Cognome</label>
            <input type="text" class="form-control" name="surname" placeholder="Inserisci il cognome dell'istruttore">
          </div>

          <div class="form-group">
            <label for="description">Descrizione</label>
            <textarea class="form-control" name="description" rows="8" cols="80"></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="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="INSERISCI ISTRUTTORE">
          </div>
        </form>
    </div>
  </div>
</div>
public function store(Request $request)
    
        $data = $request->all();

        $image = Storage::disk('public')->put('trainers',$data['image']);

        $newTrainer = New Trainer();

        $newTrainer->name = $data['name'];
        $newTrainer->surname = $data['surname'];
        $newTrainer->description = $data['description'];
        $newTrainer->image = $image;

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

        $newTrainer->save();

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

【问题讨论】:

在附加课程之前先尝试保存您的培训师。 嘿兄弟,已经发布了你的模型培训师 正如@thisiskelvin 所说,您可能需要先保存新的trainer,因为我们需要它有一个id(存储到数据库时自动分配)来存储在@987654326 @. 谢谢大家,现在您输入了两个 id,但始终只插入一条记录,即使我选择了 3 门课程,这是培训师模型命名空间 App;使用 Illuminate\Database\Eloquent\Model;类培训师扩展模型 protected $fillable = ['name','surname','description','image'];公共函数课程()返回$this->belongsToMany(Course::class)->withTimestamps(); 检查this q/a. 【参考方案1】:

谢谢大家,现在您输入了两个 ID,但即使我选择了 3 门课程,您也始终只插入一条记录

这是训练模型

    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();
    


【讨论】:

【参考方案2】:

大家好,我已经解决了这个问题,在 create.blade.php 中输入复选框的名称中,我在名称中添加了方括号

          @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

我定位

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

之后

$newTrainer->save();

现在一切正常

谢谢大家的帮助

【讨论】:

以上是关于在 Laravel 中填充具有多对多关系的表的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 中搜索查询并计算结果的多对多关系

laravel中具有多对多关系的高级搜索

Laravel 4:具有额外关系的多对多

两个以上具有多对多关系的表[重复]

在 Laravel 中查询用户的多对多关系

孩子不会更新 Xamarin SQLite 扩展 - 多对多关系