Hàm tổng hợp trong Laravel Eloquent
Laravel Eloquent cho phép bạn truy vấn số lượng của một mối quan hệ bằng cách sử dụng 79. Aggregate mở rộng Eloquent bằng cách thêm 80, 81, 82 và 83Điều này dựa trên công việc trong $orders = Order::withSum('products', 'quantity')->get(); $orders->each(function ($order) { $order->products_sum; });0 - cảm ơn Mohammad Sharif Ahrari (@spyp) Cài đặtBạn có thể cài đặt gói qua Composer composer require watson/aggregate Cách sử dụngCác phương thức bổ sung sẽ được bổ sung bởi tính năng khám phá tự động của Laravel. Sau đó, bạn có thể sử dụng chúng giống như cách bạn đã sử dụng 79. Xem tài liệu về Laravel để biết thêm về cách thức hoạt động của nó Các bảng cơ sở dữ liệu thường liên quan đến nhau. Ví dụ: một bài đăng trên blog có thể có nhiều bình luận hoặc một đơn đặt hàng có thể liên quan đến người dùng đã đặt nó. Eloquent làm cho việc quản lý và làm việc với các mối quan hệ này trở nên dễ dàng và hỗ trợ nhiều loại mối quan hệ phổ biến Xác định mối quan hệCác mối quan hệ Eloquent được định nghĩa là các phương thức trên các lớp mô hình Eloquent của bạn. Vì các mối quan hệ cũng đóng vai trò là trình tạo truy vấn mạnh mẽ, nên việc xác định các mối quan hệ dưới dạng phương thức cung cấp khả năng truy vấn và xâu chuỗi phương thức mạnh mẽ. Ví dụ: chúng tôi có thể xâu chuỗi các ràng buộc truy vấn bổ sung trên mối quan hệ 34 này
Tuy nhiên, trước khi đi sâu vào việc sử dụng các mối quan hệ, hãy tìm hiểu cách xác định từng loại mối quan hệ được hỗ trợ bởi Eloquent Một Đối MộtMối quan hệ một đối một là một kiểu quan hệ cơ sở dữ liệu rất cơ bản. Ví dụ: một mô hình 35 có thể được liên kết với một mô hình 36. Để xác định mối quan hệ này, chúng tôi sẽ đặt một phương thức 37 trên mô hình 35. Phương thức 37 nên gọi phương thức 40 và trả về kết quả của nó. Phương thức 40 có sẵn cho mô hình của bạn thông qua lớp cơ sở 42 của mô hình
Đối số đầu tiên được truyền cho phương thức 40 là tên của lớp mô hình liên quan. Khi mối quan hệ được xác định, chúng tôi có thể truy xuất bản ghi liên quan bằng các thuộc tính động của Eloquent. Các thuộc tính động cho phép bạn truy cập các phương thức quan hệ như thể chúng là các thuộc tính được xác định trên mô hìnhcomposer require watson/aggregate4 Eloquent xác định khóa ngoại của quan hệ dựa trên tên model gốc. Trong trường hợp này, mô hình 36 tự động được coi là có khóa ngoại 45. Nếu bạn muốn ghi đè quy ước này, bạn có thể chuyển đối số thứ hai cho phương thức 40composer require watson/aggregate8 Ngoài ra, Eloquent giả định rằng khóa ngoại phải có giá trị khớp với cột khóa chính của khóa gốc. Nói cách khác, Eloquent sẽ tìm kiếm giá trị của cột 47 của người dùng trong cột 45 của bản ghi 36. Nếu bạn muốn mối quan hệ sử dụng giá trị khóa chính khác với 47 hoặc thuộc tính 51 của mô hình của bạn, bạn có thể chuyển đối số thứ ba cho phương thức 40 5Xác định nghịch đảo của mối quan hệVì vậy, chúng tôi có thể truy cập mô hình 36 từ mô hình 35 của chúng tôi. Tiếp theo, hãy xác định mối quan hệ trên mô hình 36 sẽ cho phép chúng tôi truy cập người dùng sở hữu điện thoại. Chúng ta có thể định nghĩa nghịch đảo của mối quan hệ 40 bằng cách sử dụng phương pháp 57 1Khi gọi phương thức 58, Eloquent sẽ cố gắng tìm một mô hình 35 có một 47 khớp với cột 45 trên mô hình 36Eloquent xác định tên khóa ngoại bằng cách kiểm tra tên của phương thức quan hệ và thêm hậu tố tên phương thức là 63. Vì vậy, trong trường hợp này, Eloquent giả định rằng mô hình 36 có cột 45. Tuy nhiên, nếu khóa ngoại trên mô hình 36 không phải là 45, bạn có thể chuyển tên khóa tùy chỉnh làm đối số thứ hai cho phương thức 57 3Nếu mô hình gốc không sử dụng 47 làm khóa chính hoặc bạn muốn tìm mô hình được liên kết bằng một cột khác, bạn có thể chuyển đối số thứ ba cho phương thức 57 chỉ định khóa tùy chỉnh của bảng cha 6một đến nhiềuMối quan hệ một-nhiều được sử dụng để xác định các mối quan hệ trong đó một mô hình đơn lẻ là cha của một hoặc nhiều mô hình con. Ví dụ: một bài đăng trên blog có thể có vô số bình luận. Giống như tất cả các mối quan hệ Eloquent khác, mối quan hệ một-nhiều được xác định bằng cách xác định một phương thức trên mô hình Eloquent của bạn 7Hãy nhớ rằng, Eloquent sẽ tự động xác định cột khóa ngoại thích hợp cho mô hình 71. Theo quy ước, Eloquent sẽ lấy tên "snake case" của model gốc và thêm vào hậu tố là 63. Vì vậy, trong ví dụ này, Eloquent sẽ giả sử cột khóa ngoại trên mô hình 71 là 74Khi phương thức quan hệ đã được xác định, chúng ta có thể truy cập vào bộ sưu tập các nhận xét có liên quan bằng cách truy cập thuộc tính 75. Hãy nhớ rằng, vì Eloquent cung cấp "các thuộc tính quan hệ động", nên chúng ta có thể truy cập các phương thức quan hệ như thể chúng được định nghĩa là các thuộc tính trên model 3Vì tất cả các mối quan hệ cũng đóng vai trò là trình tạo truy vấn, bạn có thể thêm các ràng buộc khác vào truy vấn mối quan hệ bằng cách gọi phương thức 75 và tiếp tục xâu chuỗi các điều kiện vào truy vấn 0Giống như phương thức 40, bạn cũng có thể ghi đè khóa ngoại và khóa cục bộ bằng cách chuyển các đối số bổ sung cho phương thức 78 1Một Đến Nhiều (Nghịch Đảo) / Thuộc VềBây giờ chúng ta có thể truy cập tất cả các bình luận của bài đăng, hãy xác định mối quan hệ để cho phép một bình luận truy cập bài đăng gốc của nó. Để xác định nghịch đảo của mối quan hệ 78, hãy xác định phương thức quan hệ trên mô hình con gọi phương thức 57 2Khi mối quan hệ đã được xác định, chúng tôi có thể truy xuất bài đăng gốc của nhận xét bằng cách truy cập "thuộc tính mối quan hệ động" của 81 3Trong ví dụ trên, Eloquent sẽ cố gắng tìm một mô hình 82 có một 47 khớp với cột 74 trên mô hình 71Eloquent xác định tên khóa ngoại mặc định bằng cách kiểm tra tên của phương thức quan hệ và thêm vào hậu tố tên phương thức một 86 theo sau là tên của cột khóa chính của mô hình gốc. Vì vậy, trong ví dụ này, Eloquent sẽ giả sử khóa ngoại của mô hình 82 trên bảng 75 là 74Tuy nhiên, nếu khóa ngoại cho mối quan hệ của bạn không tuân theo các quy ước này, bạn có thể chuyển tên khóa ngoại tùy chỉnh làm đối số thứ hai cho phương thức 57 4Nếu mô hình gốc của bạn không sử dụng 47 làm khóa chính hoặc bạn muốn tìm mô hình được liên kết bằng một cột khác, bạn có thể chuyển đối số thứ ba cho phương thức 57 chỉ định khóa tùy chỉnh của bảng cha mẹ của bạn 5Mô hình mặc địnhCác mối quan hệ 57, 40, 95 và 96 cho phép bạn xác định một mô hình mặc định sẽ được trả về nếu mối quan hệ đã cho là 97. Mẫu này thường được gọi là mẫu Đối tượng Null và có thể giúp loại bỏ các kiểm tra có điều kiện trong mã của bạn. Trong ví dụ sau, quan hệ 58 sẽ trả về một mô hình 99 trống nếu không có người dùng nào được đính kèm vào mô hình 82 6Để điền các thuộc tính vào mô hình mặc định, bạn có thể truyền một mảng hoặc bao đóng cho phương thức composer require watson/aggregate401 7Truy vấn thuộc về các mối quan hệKhi truy vấn các phần tử con của mối quan hệ "thuộc về", bạn có thể xây dựng mệnh đề composer require watson/aggregate402 theo cách thủ công để truy xuất các mô hình Eloquent tương ứng 8Tuy nhiên, bạn có thể thấy thuận tiện hơn khi sử dụng phương pháp composer require watson/aggregate403, phương pháp này sẽ tự động xác định mối quan hệ thích hợp và khóa ngoại cho mô hình đã cho 9Bạn cũng có thể cung cấp một thể hiện bộ sưu tập cho phương thức composer require watson/aggregate403. Khi làm như vậy, Laravel sẽ truy xuất các mô hình thuộc về bất kỳ mô hình cha nào trong bộ sưu tập composer require watson/aggregate40 Theo mặc định, Laravel sẽ xác định mối quan hệ được liên kết với mô hình đã cho dựa trên tên lớp của mô hình; composer require watson/aggregate41 Có Một Trong NhiềuĐôi khi một mô hình có thể có nhiều mô hình liên quan, nhưng bạn muốn dễ dàng truy xuất mô hình liên quan "mới nhất" hoặc "cũ nhất" của mối quan hệ. Ví dụ: một mô hình 35 có thể liên quan đến nhiều mô hình composer require watson/aggregate407, nhưng bạn muốn xác định một cách thuận tiện để tương tác với đơn hàng gần đây nhất mà người dùng đã đặt. Bạn có thể thực hiện điều này bằng cách sử dụng loại mối quan hệ 40 kết hợp với các phương pháp composer require watson/aggregate409 composer require watson/aggregate42 Tương tự như vậy, bạn có thể xác định một phương thức để truy xuất mô hình liên quan "cũ nhất" hoặc đầu tiên của một mối quan hệ composer require watson/aggregate43 Theo mặc định, các phương thức composer require watson/aggregate410 và composer require watson/aggregate411 sẽ truy xuất mô hình liên quan mới nhất hoặc cũ nhất dựa trên khóa chính của mô hình, khóa này phải có thể sắp xếp được. Tuy nhiên, đôi khi bạn có thể muốn truy xuất một mô hình từ một mối quan hệ lớn hơn bằng cách sử dụng tiêu chí sắp xếp khác Ví dụ: sử dụng phương pháp composer require watson/aggregate409, bạn có thể truy xuất đơn đặt hàng đắt nhất của người dùng. Phương thức composer require watson/aggregate409 chấp nhận cột có thể sắp xếp làm đối số đầu tiên của nó và hàm tổng hợp nào ( composer require watson/aggregate414 hoặc composer require watson/aggregate415) sẽ áp dụng khi truy vấn mô hình liên quan composer require watson/aggregate44
Nâng cao có một trong nhiều mối quan hệCó thể xây dựng các mối quan hệ "có một trong nhiều" nâng cao hơn. Ví dụ: mô hình composer require watson/aggregate417 có thể có nhiều mô hình composer require watson/aggregate418 được liên kết được giữ lại trong hệ thống ngay cả sau khi giá mới được công bố. Ngoài ra, dữ liệu giá mới cho sản phẩm có thể được xuất bản trước để có hiệu lực vào một ngày trong tương lai thông qua cột composer require watson/aggregate419 Vì vậy, tóm lại, chúng tôi cần truy xuất giá được xuất bản mới nhất khi ngày xuất bản không phải là trong tương lai. Ngoài ra, nếu hai giá có cùng ngày xuất bản, chúng tôi sẽ ưu tiên giá có ID lớn nhất. Để thực hiện điều này, chúng ta phải chuyển một mảng tới phương thức composer require watson/aggregate409 có chứa các cột có thể sắp xếp để xác định giá mới nhất. Ngoài ra, một bao đóng sẽ được cung cấp làm đối số thứ hai cho phương thức composer require watson/aggregate409. Việc đóng này sẽ chịu trách nhiệm thêm các ràng buộc ngày xuất bản bổ sung vào truy vấn mối quan hệ composer require watson/aggregate45 Có Một Thông QuaMối quan hệ "có một lần" xác định mối quan hệ một-một với một mô hình khác. Tuy nhiên, mối quan hệ này chỉ ra rằng mô hình khai báo có thể được khớp với một phiên bản của mô hình khác bằng cách tiếp tục thông qua mô hình thứ ba Ví dụ: trong một ứng dụng cửa hàng sửa chữa xe, mỗi kiểu máy composer require watson/aggregate422 có thể được liên kết với một kiểu máy composer require watson/aggregate423 và mỗi kiểu máy composer require watson/aggregate423 có thể được liên kết với một kiểu máy composer require watson/aggregate425. Mặc dù thợ máy và chủ sở hữu không có mối quan hệ trực tiếp trong cơ sở dữ liệu, nhưng thợ máy có thể truy cập chủ sở hữu thông qua mô hình composer require watson/aggregate423. Hãy xem các bảng cần thiết để xác định mối quan hệ này Bây giờ chúng ta đã kiểm tra cấu trúc bảng cho mối quan hệ, hãy xác định mối quan hệ trên mô hình composer require watson/aggregate422 composer require watson/aggregate46 Đối số đầu tiên được truyền cho phương thức 95 là tên của mô hình cuối cùng mà chúng tôi muốn truy cập, trong khi đối số thứ hai là tên của mô hình trung gianCông ước chínhCác quy ước khóa ngoại điển hình của Eloquent sẽ được sử dụng khi thực hiện các truy vấn của mối quan hệ. Nếu bạn muốn tùy chỉnh các khóa của mối quan hệ, bạn có thể chuyển chúng làm đối số thứ ba và thứ tư cho phương thức 95. Đối số thứ ba là tên của khóa ngoại trên mô hình trung gian. Đối số thứ tư là tên của khóa ngoại trên mô hình cuối cùng. Đối số thứ năm là khóa cục bộ, trong khi đối số thứ sáu là khóa cục bộ của mô hình trung giancomposer require watson/aggregate47 Có Nhiều Thông QuaMối quan hệ "có nhiều thông qua" cung cấp một cách thuận tiện để truy cập các mối quan hệ ở xa thông qua một mối quan hệ trung gian. Ví dụ: giả sử chúng ta đang xây dựng một nền tảng triển khai như Laravel Vapor. Mô hình composer require watson/aggregate430 có thể truy cập nhiều mô hình composer require watson/aggregate431 thông qua mô hình trung gian composer require watson/aggregate432. Sử dụng ví dụ này, bạn có thể dễ dàng thu thập tất cả các triển khai cho một dự án nhất định. Hãy xem các bảng cần thiết để xác định mối quan hệ này Bây giờ chúng ta đã kiểm tra cấu trúc bảng cho mối quan hệ, hãy xác định mối quan hệ trên mô hình composer require watson/aggregate430 composer require watson/aggregate48 Đối số đầu tiên được truyền cho phương thức composer require watson/aggregate434 là tên của mô hình cuối cùng mà chúng tôi muốn truy cập, trong khi đối số thứ hai là tên của mô hình trung gian Mặc dù bảng của mô hình composer require watson/aggregate431 không chứa cột composer require watson/aggregate436, nhưng mối quan hệ composer require watson/aggregate434 cung cấp quyền truy cập vào các triển khai của dự án thông qua composer require watson/aggregate438. Để truy xuất các mô hình này, Eloquent kiểm tra cột composer require watson/aggregate436 trên bảng của mô hình trung gian composer require watson/aggregate432. Sau khi tìm thấy ID môi trường có liên quan, chúng được sử dụng để truy vấn bảng của mô hình composer require watson/aggregate431 Công ước chínhCác quy ước khóa ngoại điển hình của Eloquent sẽ được sử dụng khi thực hiện các truy vấn của mối quan hệ. Nếu bạn muốn tùy chỉnh các khóa của mối quan hệ, bạn có thể chuyển chúng làm đối số thứ ba và thứ tư cho phương thức composer require watson/aggregate434. Đối số thứ ba là tên của khóa ngoại trên mô hình trung gian. Đối số thứ tư là tên của khóa ngoại trên mô hình cuối cùng. Đối số thứ năm là khóa cục bộ, trong khi đối số thứ sáu là khóa cục bộ của mô hình trung gian composer require watson/aggregate49 Nhiều đến nhiều mối quan hệMối quan hệ nhiều-nhiều phức tạp hơn một chút so với mối quan hệ 40 và 78. Một ví dụ về mối quan hệ nhiều-nhiều là một người dùng có nhiều vai trò và những vai trò đó cũng được chia sẻ bởi những người dùng khác trong ứng dụng. Ví dụ: người dùng có thể được chỉ định vai trò "Tác giả" và "Biên tập viên"; . Vì vậy, một người dùng có nhiều vai trò và một vai trò có nhiều người dùngCấu trúc bảngĐể xác định mối quan hệ này, cần có ba bảng cơ sở dữ liệu. composer require watson/aggregate445, composer require watson/aggregate446 và composer require watson/aggregate447. Bảng composer require watson/aggregate447 được lấy từ thứ tự bảng chữ cái của tên kiểu máy có liên quan và chứa các cột 45 và composer require watson/aggregate450. Bảng này được sử dụng làm bảng trung gian liên kết người dùng và vai trò Hãy nhớ rằng, vì một vai trò có thể thuộc về nhiều người dùng, nên chúng ta không thể chỉ đặt một cột 45 trên bảng composer require watson/aggregate446. Điều này có nghĩa là một vai trò chỉ có thể thuộc về một người dùng. Để cung cấp hỗ trợ cho các vai trò được gán cho nhiều người dùng, bảng composer require watson/aggregate447 là cần thiết. Chúng ta có thể tóm tắt cấu trúc bảng của mối quan hệ như vậy Cấu trúc mô hìnhMối quan hệ nhiều-nhiều được xác định bằng cách viết một phương thức trả về kết quả của phương thức composer require watson/aggregate454. Phương thức composer require watson/aggregate454 được cung cấp bởi lớp cơ sở 42 được sử dụng bởi tất cả các mô hình Eloquent trong ứng dụng của bạn. Ví dụ: hãy xác định phương thức composer require watson/aggregate446 trên mô hình 35 của chúng tôi. Đối số đầu tiên được truyền cho phương thức này là tên của lớp mô hình liên quancomposer require watson/aggregate80 Khi mối quan hệ được xác định, bạn có thể truy cập vai trò của người dùng bằng thuộc tính mối quan hệ động composer require watson/aggregate446 composer require watson/aggregate81 Vì tất cả các mối quan hệ cũng đóng vai trò là trình tạo truy vấn, nên bạn có thể thêm các ràng buộc khác vào truy vấn mối quan hệ bằng cách gọi phương thức composer require watson/aggregate446 và tiếp tục xâu chuỗi các điều kiện vào truy vấn composer require watson/aggregate82 Để xác định tên bảng của bảng trung gian của mối quan hệ, Eloquent sẽ nối hai tên mô hình có liên quan theo thứ tự bảng chữ cái. Tuy nhiên, bạn có thể tự do ghi đè quy ước này. Bạn có thể làm như vậy bằng cách chuyển đối số thứ hai cho phương thức composer require watson/aggregate454 composer require watson/aggregate83 Ngoài việc tùy chỉnh tên của bảng trung gian, bạn cũng có thể tùy chỉnh tên cột của các khóa trên bảng bằng cách chuyển các đối số bổ sung cho phương thức composer require watson/aggregate454. Đối số thứ ba là tên khóa ngoại của mô hình mà bạn đang xác định mối quan hệ, trong khi đối số thứ tư là tên khóa ngoại của mô hình mà bạn đang tham gia composer require watson/aggregate84 Xác định nghịch đảo của mối quan hệĐể xác định "nghịch đảo" của mối quan hệ nhiều-nhiều, bạn nên xác định một phương thức trên mô hình liên quan, phương thức này cũng trả về kết quả của phương thức composer require watson/aggregate454. Để hoàn thành ví dụ về vai trò/người dùng của chúng tôi, hãy xác định phương thức composer require watson/aggregate445 trên mô hình composer require watson/aggregate465 composer require watson/aggregate85 Như bạn có thể thấy, mối quan hệ được xác định chính xác giống như đối tác mô hình 35 của nó, ngoại trừ việc tham chiếu mô hình 99. Vì chúng tôi đang sử dụng lại phương pháp composer require watson/aggregate454, nên tất cả các tùy chọn tùy chỉnh khóa và bảng thông thường đều khả dụng khi xác định "nghịch đảo" của mối quan hệ nhiều-nhiều Truy xuất các cột trong bảng trung gianNhư bạn đã biết, làm việc với quan hệ nhiều-nhiều yêu cầu phải có bảng trung gian. Eloquent cung cấp một số cách rất hữu ích để tương tác với bảng này. Ví dụ: giả sử mô hình 35 của chúng tôi có nhiều mô hình composer require watson/aggregate465 liên quan đến. Sau khi truy cập vào mối quan hệ này, chúng ta có thể truy cập vào bảng trung gian bằng cách sử dụng thuộc tính composer require watson/aggregate471 trên các mô hình composer require watson/aggregate86 Lưu ý rằng mỗi mô hình composer require watson/aggregate465 mà chúng tôi truy xuất được tự động gán một thuộc tính composer require watson/aggregate471. Thuộc tính này chứa một mô hình đại diện cho bảng trung gian Theo mặc định, chỉ các phím mô hình sẽ có mặt trên mô hình composer require watson/aggregate471. Nếu bảng trung gian của bạn chứa các thuộc tính bổ sung, bạn phải chỉ định chúng khi xác định mối quan hệ composer require watson/aggregate87 Nếu bạn muốn bảng trung gian của mình có dấu thời gian composer require watson/aggregate475 và composer require watson/aggregate476 được Eloquent tự động duy trì, hãy gọi phương thức composer require watson/aggregate477 khi xác định mối quan hệ composer require watson/aggregate88
Tùy chỉnh tên thuộc tính |