我有一个名称为CourseSession
的模型类,它的表是course_session
,还有另一个名为Student
的模型,它的表是student
,每个会话都有很多学生,每个学生都可以参加很多次会议。因此,我用student_session
,student_id
,session_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
表上写数据!
我的代码有什么问题?
答案 0 :(得分:1)
为此,您要使用attach()而不是create()
。
$session->students()->attach(1, ['presence' => 1]);
在上面的示例中,1
是student_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列(显然,如果您不想这样做,则不必这样做)。