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ố 8Chú ý 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
4Hiệ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
6Bâ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 ứngXá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
7projects
id
name
8Khi 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
7Bâ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ạiprojects
id
name
8Vì 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ùngVì 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ặpNế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àyprojects
id
name
9hoặ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èmusers
id
name
9Bâ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àmprojects
id
name
2Hoặ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
3Nhữ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
0Ngườ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ạyprojects
id
name
119 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
2Bâ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
3Bâ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ạyprojects
id
name
4Bâ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âyCậ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ý doBạ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ơnTù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
2Giả 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
6projects
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