如何在错误的表上修复laravel雄辩的多对多关系插入错误

时间:2019-04-28 09:57:47

标签: laravel eloquent

我有一个名称为CourseSession的模型类,它的表是course_session,还有另一个名为Student的模型,它的表是student,每个会话都有很多学生,每个学生都可以参加很多次会议。因此,我用student_sessionstudent_idsession_id和laravel时间戳列创建了名为presence的第三张表。

创建会议需要有一个学生列表,我可以这样从$request中获取他们:

$validatedData = $request->validate([
    'students' => 'required',
]);

students是学生ID的数组!

这是我的CourseSession模型:

class CourseSession extends Model
{
    protected $table = 'course_sessions';
    protected $guarded = [];

    public function course()
    {
        return $this->belongsTo('App\Course');
    }

    public function students()
    {
        return $this->belongsToMany('App\Student', 'student_session','session_id', 'student_id');
    }
}

这是我的学生模型:

class Student extends Model
{
    protected $guarded = [];

    public function courses()
    {
        return $this->belongsToMany('App\Course');
    }

    public function exams()
    {
        return $this->belongsToMany('App\Exam');
    }

    public function sessions()
    {
        return $this->belongsToMany('App\CourseSession', 'student_session', 'student_id', 'session_id');
    }
}

我创建一个像这样的会话:

$session = new CourseSession();
$session->course_id = $course->id;
$session->save();

我这样保存学生:

$sessions = $session->students()->create(['session_id' => $session->id, 'student_id' => 1, 'presence' => 1]);

但我收到此错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'session_id' in 'field list' (SQL: insert into `students` (`session_id`, `student_id`, `presence`, `updated_at`, `created_at`) values (25, 1, 1, 2019-04-28 14:24:48, 2019-04-28 14:24:48))

根据错误,它尝试在students表上写数据,但我想在student_session表上写数据!

我的代码有什么问题?

1 个答案:

答案 0 :(得分:1)

为此,您要使用attach()而不是create()

$session->students()->attach(1, ['presence' => 1]);

在上面的示例中,1student_id。您无需指定session_id作为从Session模型进行调用的方式。最后的数组是要添加到数据透视表中的所有其他数据。

由于student_session数据透视表中还有其他数据,因此最好将其添加到belongsToMany关系中,例如

public function sessions()
{
    return $this->belongsToMany('App\CourseSession', 'student_session', 'student_id', 'session_id')
        ->withPivot('presence')
        ->withTimestamps();
}

这还将在数据透视表数据中包含presence和timestamps列(显然,如果您不想这样做,则不必这样做)。