Pivot Table Laravel với 3 cột khoá chính
Các tiền bối cho em hỏi về khái niệm Pivot Table
Theo em tìm hiểu thì bảng trung gian sẽ tên là pivot table, tức là nó có khoá chính là 2 cột khoá ngoại. Và thường sẽ không tạo Model cho nó.
VD:
Ngành: mã, tên => Model: Nganh
Môn: mã, tên => Model: Mon
Ngành chi tiết: mã ngành, mã môn => không có Model mà ghi belongsToMany trong từng Model trên
Để biết được ngành đó chứa những môn nào và môn này thuộc những ngành nào (mỗi quan hệ N - N).
Nhưng nếu giả sử em có bảng
Sinh viên: mã, tên => Model: SinhVien
Môn: mã, tên => Model: Mon
Điểm: mã môn, mã sinh viên, lần thi, điểm
Thì bảng điểm em để 3 cột: mã môn, mã sinh viên, lần thi là khoá chính (tức là không cho lặp lại). Thì có thể áp dụng pivot tương tự như trên không ạ? (nếu có thể ghi belongToMany thế nào ạ?) Hay là tạo Model độc lập.
1 CÂU TRẢ LỜI
nếu bạn muốn mỗi quan hệ giữa 1 sinh viên và 1 môn chỉ xuất hiện 1 lần duy nhất thì có thể đánh unique cho 2 cột là student_id, subject_id. Bạn có thể thêm bằng lệnh migration như này
public function up()
{
Schema::table('marks, function (Blueprint $table) {
$table->unique(['student_id', 'subject_id']);
});
}
ý em là tận 3 cột là khóa chính (thêm cột lần thi) nữa cơ ạ
@j2teamnnl nó sẽ xác định được quan hệ nhờ subject_id và student_id, và bạn muốn đưa thêm thông tin vào thì cứ đưa vào thoải mái. Và khi muốn truy vần qua eloquent thì ở Model, khi thiết lập quan hệ bạn cần gọi thêm withPivot
Vd:
public function students()
{
return $this->belongsToMany(Student::class)->withPivot(['col1', 'col2']);
}
Ý bác là tạo Model Mark có 3 cột khóa chính rồi dùng belongsToMany ạ?
@j2teamnnl không cần bạn, bạn cứ quy định quan hệ trong model của 2 Model subject và student, sau đó dùng withPivot
là sẽ truy vấn được thêm các cột mà bạn đưa thêm vào bảng trung gian. Và thật ra ngay cả việc bạn tạo model Mark cũng không có vấn đề gì cả, mình nghĩ là cách nào cũng ổn
Nhưng khi updateOrCreate theo 3 khóa chính thì khó bác ạ. Vì nếu không có Model, dùng sync của pivot thì em không biết ghi kiểu gì.