Mối quan hệ nhiều đến nhiều của Laravel với bảng tổng hợp

Laravel cung cấp các hệ thống Object Relational Mapping đẹp nhất mà tôi từng sử dụng với Eloquent. Eloquent có rất nhiều tính năng mạnh mẽ giúp làm việc với cơ sở dữ liệu trở nên thú vị. Một trong những tính năng yêu thích của tôi về Laravel Eloquent là cấu trúc mối quan hệ nhiều-nhiều. Khi tôi phải viết SQL thô, tôi luôn ghét mối quan hệ nhiều-nhiều. Với Eloquent, chúng thật dễ dàng

Trong hướng dẫn này, chúng ta sẽ thực hiện một số phương pháp yêu thích của tôi khi cập nhật và tạo mối quan hệ nhiều-nhiều với Laravel Eloquent. Có rất nhiều phương pháp cơ bản và hữu ích khác có sẵn cho

Tuy nhiên, tôi luôn hơi bối rối khi tạo và cập nhật dữ liệu liên quan nên tôi đã viết hướng dẫn này như một hướng dẫn cho chính mình và cho bạn. Tôi có xu hướng sử dụng rất nhiều trong số này để thiết lập Cổng & Chính sách và các cấu trúc cấp phép khác trong Laravel

Thiết lập mối quan hệ nhiều-nhiều với Laravel Eloquent

Đối với ví dụ này, chúng tôi sẽ sử dụng một tình huống thực tế mà chúng tôi đã gặp khi xây dựng Bugflow. Đó là quản lý quyền của người dùng đối với các dự án và tổ chức. Đối với ví dụ này, mọi người dùng có thể thuộc về nhiều dự án và nhiều tổ chức. Trên mỗi dự án và tổ chức, người dùng có quyền. Chúng sẽ được lưu trữ trong bảng tổng hợp cùng với mối quan hệ với dự án. Hãy thiết lập điều này

Đầu tiên, chúng tôi sẽ tạo 3 bảng trong Cài đặt Laravel của chúng tôi. Các bảng sẽ là

projects
	id
	name
6 ,
projects
	id
	name
7 và
projects
	id
	name
8. Để đơn giản, tôi sẽ không thêm MỌI trường, chỉ đủ để đảm bảo hướng dẫn này có ý nghĩa

Ở cấp độ cơ bản nhất, bảng

projects
	id
	name
6 của chúng ta sẽ giống như

users
	id
	name

Bảng

projects
	id
	name
7 của chúng ta sẽ trông giống như

projects
	id
	name

Và bảng

projects
	id
	name
8 của chúng ta sẽ giống như

________số 8

Chú ý cột

users_projects
	user_id
	project_id
	permission
2 trên bảng
projects
	id
	name
8? . Trong các tài liệu tham khảo sau này, bảng này còn được gọi là bảng
users_projects
	user_id
	project_id
	permission
4

Hiện tại, các giá trị của cột

users_projects
	user_id
	project_id
	permission
2 có thể là
users_projects
	user_id
	project_id
	permission
6 hoặc
users_projects
	user_id
	project_id
	permission
7. Tôi sẽ ghi lại cách cập nhật giá trị này một cách hiệu quả. Khi tạo bảng, tôi luôn đặt mặc định cột
users_projects
	user_id
	project_id
	permission
2 là
users_projects
	user_id
	project_id
	permission
7. Bằng cách này, chúng tôi chỉ có thể trực tiếp đặt giá trị này nếu cần và không vô tình tạo người dùng có quyền
users_projects
	user_id
	project_id
	permission
6

Bây giờ chúng ta đã xây dựng các bảng của mình, hãy xác định các mối quan hệ của chúng ta trong các mô hình Eloquent

projects
	id
	name
81 và
projects
	id
	name
82 tương ứng

Xác định mối quan hệ của chúng ta

Trước khi chuyển sang tất cả các phương thức liên quan đến mối quan hệ nhiều-nhiều, chúng ta phải xác định mối quan hệ trên từng mô hình của mình. Với Eloquent, bạn phải sử dụng mối quan hệ ________ 183 trên cả _____ 184 và ________ 185. Trước tiên, hãy mở mô hình

projects
	id
	name
84 của chúng tôi và thêm mối quan hệ
projects
	id
	name
7

projects
	id
	name
8

Khi thiết lập quan hệ many-to-many với Eloquent, có 4 thông số bạn cần thiết lập. Tham số đầu tiên là mô hình bạn đang liên quan đến. Trong trường hợp này, đó là

projects
	id
	name
88. Tham số thứ hai là bảng mà mối quan hệ diễn ra trên. Vì vậy, chúng tôi sử dụng bảng tổng hợp của mình là
projects
	id
	name
8. Tham số thứ ba là khóa trên bảng tổng hợp chứa khóa của mô hình mà chúng ta đang liên quan. Tất cả người dùng của chúng tôi đều có trường
projects
	id
	name
80. Trên bảng tổng hợp, đây là
projects
	id
	name
81. Chúng tôi sử dụng giá trị
projects
	id
	name
81. Cuối cùng, chúng tôi chọn khóa ngoại liên quan. Đây là khóa trên bảng tổng hợp xác định mối quan hệ với dự án. Trong trường hợp này, đó là
projects
	id
	name
83 sẽ tham chiếu đến
projects
	id
	name
80 trên bảng
projects
	id
	name
7

Bây giờ khi chúng ta nhìn vào mô hình

projects
	id
	name
85 của mình, nó sẽ trông rất giống nhau, chỉ là từ góc nhìn ngược lại

projects
	id
	name
8

Vì vậy, bây giờ chúng tôi có thể gọi

projects
	id
	name
87 và
projects
	id
	name
88 để có được tất cả người dùng trong một dự án và tất cả các dự án thuộc về người dùng

Vì bây giờ chúng ta đã thiết lập các mối quan hệ của mình, hãy xem xét tất cả các cách khác nhau mà chúng ta có thể thêm và xóa các mối quan hệ

Đính kèm với dữ liệu Pivot

Một trong những tính năng tốt nhất về Laravel là tài liệu của họ cung cấp rất nhiều thông tin hữu ích. Chúng bao gồm rất nhiều khái niệm cơ bản về , chẳng hạn như

projects
	id
	name
89 và
projects
	id
	name
90. Điều tôi sẽ tập trung vào là một số “trường hợp cạnh” khác mà tôi đã gặp

Nếu bạn liên kết một dự án với người dùng bằng cách sử dụng

projects
	id
	name
89, mã sẽ trông như thế này

projects
	id
	name
9

hoặc bạn có thể tự chuyển mô hình dự án

users
	id
	name
2

Đây là những điều tuyệt vời, tuy nhiên chúng đưa ra một thách thức nếu bạn muốn

projects
	id
	name
92 trên bảng
projects
	id
	name
8 là bất kỳ thứ gì khác ngoài
users_projects
	user_id
	project_id
	permission
7. Giống như nếu bạn đang thêm một
users_projects
	user_id
	project_id
	permission
6 vào một dự án. Để làm điều đó, bạn phải chuyển
users_projects
	user_id
	project_id
	permission
2 cùng với
projects
	id
	name
80 của dự án mà bạn đang đính kèm

users
	id
	name
9

Bây giờ, phương thức

projects
	id
	name
98 lấy một mảng nhiều chiều với khóa là
projects
	id
	name
80 của dự án mà chúng tôi đang đính kèm và mảng phụ là một mảng được ánh xạ tới các cột của bảng tổng hợp. Nếu bạn muốn đính kèm nhiều dự án với các quyền khác nhau, bạn có thể làm

projects
	id
	name
2

Hoặc nếu bạn muốn đính kèm nhiều dự án với cùng một quyền, bạn có thể đơn giản hóa đoạn mã trên thành

projects
	id
	name
3

Những phương pháp nhỏ này siêu hữu ích. Tôi có xu hướng sử dụng nhiều hình thức của phương pháp

projects
	id
	name
89 trong suốt dự án trong các tình huống khác nhau. Tuy nhiên, tôi chỉ sử dụng mẫu
projects
	id
	name
89 nếu tôi biết mối quan hệ không có khả năng tồn tại. Nếu có khả năng mối quan hệ tồn tại [tôi. e. người dùng đã tham gia dự án], thì có thể liên kết họ hai lần. Điều đó không thuận tiện. Đối với điều đó, tôi sử dụng một mẫu
users
	id
	name
22 sẽ xuất hiện tiếp theo

Đồng bộ hóa mối quan hệ

Bất cứ khi nào tôi không biết liệu một mối quan hệ đã tồn tại hay chưa, tôi sẽ sử dụng mẫu

users
	id
	name
22. Phương pháp
users
	id
	name
22 là một cách khác để cập nhật mối quan hệ giữa hai mô hình. Sự khác biệt là bảng tổng hợp sẽ luôn đồng bộ với những gì được thông qua

Điều này có nghĩa là nếu tôi chạy đoạn mã sau

projects
	id
	name
0

Người dùng sẽ chỉ bị ràng buộc với ID dự án

users
	id
	name
25. Nếu tôi chạy mã đó ba mươi lần, mối quan hệ sẽ chỉ bị ràng buộc một lần trong bảng và nó sẽ luôn đồng bộ [hiểu không?]. Tuy nhiên, điều này sẽ trở thành vấn đề nếu người dùng của bạn có 20 dự án, bạn không biết liệu họ có ID dự án
users
	id
	name
26 hay không và bạn chạy

projects
	id
	name
1

19 dự án khác mà người dùng đã thực hiện hiện đã bị xóa. Đó là nơi mà

users
	id
	name
27 có ích

Đồng bộ hóa mà không cần tách rời

Phương pháp

users
	id
	name
27 cực kỳ hữu ích. Bằng cách này, bạn có thể thêm người dùng vào dự án NẾU họ chưa được thêm vào dự án. Giải quyết một số lưu ý của
projects
	id
	name
89 và
users
	id
	name
22

Để đính kèm một dự án cho người dùng, không biết họ đã tham gia dự án hay chưa, bạn sẽ chạy

projects
	id
	name
2

Bây giờ nếu người dùng đã có dự án, sẽ không có gì xảy ra. Tuy nhiên, nếu người dùng chưa được thêm vào dự án, phương pháp này sẽ thêm người dùng vào dự án

Bạn cũng có thể đính kèm dữ liệu trục

projects
	id
	name
3

Bây giờ bạn sẽ đảm bảo rằng nếu người dùng có dự án, họ là quản trị viên của dự án. Khá bóng bẩy

Đồng bộ hóa với các giá trị Pivot

Tương tự như cách bạn có thể chuyển một mảng gắn quyền cho mọi mối quan hệ, bạn cũng có thể làm điều đó với đồng bộ hóa. Phương pháp này là

users
	id
	name
91. Trong Bugflow, chúng tôi thực hiện việc này khi chúng tôi nâng cấp thành viên của người dùng trong một tổ chức. Vì vậy, nếu tổ chức có 15 dự án và người dùng được nâng cấp lên
users_projects
	user_id
	project_id
	permission
6, chúng tôi muốn chuyển một loạt các dự án và tất cả chúng được ràng buộc với người dùng với sự cho phép phù hợp. Để làm điều đó, bạn có thể chạy

projects
	id
	name
4

Bây giờ người dùng sẽ có quyền cho tất cả các dự án với cấp độ quản trị viên. Trong khi về chủ đề cập nhật dữ liệu bảng tổng hợp, hãy xem một trong những phương pháp yêu thích của tôi,

users
	id
	name
93. Bạn sẽ thấy lý do tại sao trong một giây

Cập nhật bảng Pivot hiện có

Khi làm việc với mối quan hệ nhiều-nhiều với Eloquent, bạn đang ánh xạ các đối tượng vào một bảng cơ sở dữ liệu. Chà, nếu bạn có một bảng tổng hợp và bạn muốn cập nhật một trong các trường tổng hợp. Bạn có thể xây dựng một mô hình như

users
	id
	name
94 và ánh xạ tới bảng đó. Nhưng điều đó đòi hỏi bạn phải có một
projects
	id
	name
80 trên bảng
projects
	id
	name
8. Bảng tổng hợp khá năng động, vì vậy,
projects
	id
	name
80 sẽ trở nên khó khăn và mức tăng tự động của bạn có thể lớn mà không có lý do

Bạn cũng có thể sử dụng mặt tiền

users
	id
	name
98 và truy vấn trực tiếp bảng tổng hợp. Điều đó thật tuyệt, nhưng có một lựa chọn tốt hơn

Tùy chọn

users
	id
	name
93 giải quyết tất cả những vấn đề này. Những gì phương pháp này thực hiện là lấy một mối quan hệ trên bảng tổng hợp, trong trường hợp của chúng tôi là
projects
	id
	name
8 và cập nhật một giá trị trục, chẳng hạn như
users_projects
	user_id
	project_id
	permission
2

Giả sử chúng ta muốn cập nhật quyền đối với dự án

users
	id
	name
26 thành
users_projects
	user_id
	project_id
	permission
6

projects
	id
	name
5

Đó là tất cả những gì bạn phải làm. Giờ đây, bạn có thể cập nhật bất kỳ dữ liệu bảng tổng hợp nào tồn tại mà không cần xây dựng mô hình trung gian hoặc truy cập trực tiếp vào cơ sở dữ liệu

Sự kết luận

Hy vọng những đoạn trích và giải thích nhỏ này sẽ giúp bạn nhiều như họ giúp tôi. Đối với tất cả các tài liệu Eloquent kiểm tra các tài liệu chính thức. Hình tôi muốn chia sẻ một vài kinh nghiệm của riêng tôi. Đôi khi tôi bối rối không biết mình nên sử dụng cái gì, vì vậy thật tốt khi có một cái gì đó để tham khảo

Bằng mọi cách, nếu bạn có thắc mắc, vui lòng liên hệ trên Twitter [@danpastori]. Nếu bạn thích những hướng dẫn này, hãy đăng ký danh sách gửi thư của chúng tôi

Chủ Đề