Yêu cầu thg 8 18, 2020 3:33 SA 193 0 1
  • 193 0 1
0

Pivot Table Laravel với 3 cột khoá chính

Chia sẻ
  • 193 0 1

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


Đã trả lời thg 8 18, 2020 3:43 SA
0

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']);
        });
    }
Chia sẻ
thg 8 18, 2020 4:16 SA

ý em là tận 3 cột là khóa chính (thêm cột lần thi) nữa cơ ạ

Avatar Dương Mạnh Hoàng @duong.manh.hoang
thg 8 18, 2020 4:20 SA

@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']);
}
thg 8 18, 2020 4:21 SA

Ý bác là tạo Model Mark có 3 cột khóa chính rồi dùng belongsToMany ạ?

Avatar Dương Mạnh Hoàng @duong.manh.hoang
thg 8 18, 2020 4:24 SA

@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

thg 8 18, 2020 4:41 SA

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ì.

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí