Home > Software engineering >  How to add information to a pivot table in laravel?
How to add information to a pivot table in laravel?

Time:01-18

I have a many:many relation between student and course.

Here are my models and my pivot table:

<?php

namespace App\Models;

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

class Student extends Model
{
    use HasFactory;

    protected $fillable = [
        'name',
        'surname',
        'age',
        'tdah',
        'description',
        'hobbies',
    ];

   /*  public function course(){
        return $this->belongsTo(Course::class);
    } */

    public function data(){
        return $this->hasMany(Datum::class, 'student_id', 'id');
    }

    public function configurations(){
        return $this->hasMany(Configuration::class, 'student_id', 'id');
    }

    public function courses(){
        return $this->belongsToMany(Course::class, 'course_student', 'student_id', 'course_id');
    }

}
<?php

namespace App\Models;

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

class Course extends Model
{
    use HasFactory;

    protected $fillable = [
        'name',
        'academic_course_id',
        'user_id',
    ];

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

    public function academicCourse()
    {
        return $this->belongsTo(AcademicCourse::class);
    }

    public function planification(){
        return $this->hasOne(Planification::class, 'course_id', 'id');
    }

    public function subjects(){
        return $this->hasMany(Subject::class, 'course_id', 'id');
    }

    /* public function students(){
        return $this->hasMany(Student::class, 'course_id', 'id');
    } */

    public function students(){
        return $this->belongsToMany(Student::class, 'course_student', 'course_id', 'student_id');
    }
}

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('course_student', function (Blueprint $table) {
            $table->id();

            $table->foreignId('course_id')->constrained()->onDelete('cascade');
            $table->foreignId('student_id')->constrained()->onDelete('cascade');

            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('course_student');
    }
};

I'd like to create a student that belongs to a group. I know how to create a student and a group, but I'd like to create a register for that student in my course_student pivot table. My StudentController method store is:

public function store(Request $request)
    {
        Student::create($request->all());
        $courses = Course::all();
        $academicCourses = AcademicCourse::all();
        return view('course.index', compact('courses', 'academicCourses')); 
    }

It creates a new student but I don`t know how to create a new register for the pivot table.

I thought about doing something like:

course_student::create(request)

in my store method but I think it isn`t that way.

CodePudding user response:

$student->courses()->attach($courseId);

https://laravel.com/docs/9.x/eloquent-relationships#updating-many-to-many-relationships

CodePudding user response:

In Laravel you can do it by using attach function, Attach() function has two parameters :

1- the another foreign key in you case attach(course_id).

2-(this is optional) array for any another columns inside pivot table for example :

attach(course_id,['users_id'=>$usersId])

In your case you will create the records inside the pivot table (course_student) via the object from student model .

$student->courses()->attach($course_id);

note : there is another method which does the opposite detach() but you need to use it carefully if you write it without any parameter it will remove all the records inside (course_student) that belong to the student object so specify the course that you want to remove it by that way :

$student->courses()->detach($course_id);

I hope that will help you ...

  • Related