Thủ thuật cho các mối quan hệ hùng hồn trong Laravel

Một trong những điểm mạnh của Laravel là cú pháp thanh lịch của nó. Nếu bạn có nhiều mô hình và mối quan hệ trong Laravel (do có nhiều bảng trong cơ sở dữ liệu), việc duyệt qua thường có thể kết thúc bằng mã kém thanh lịch. Theo thời gian, ba phần mở rộng nhỏ đã chứng minh giá trị của chúng đối với tôi, mà tôi muốn giới thiệu ngắn gọn dưới đây. Chúng tôi chỉ sử dụng một số kế thừa, phương pháp ma thuật và bộ sưu tập tùy chỉnh.


Đầu tiên, chúng tôi tạo một mô hình mới trong app \ ConvenienceModel.php:

b45e29b9125c2ab565b5526442437686

Sau đó, chúng tôi để tất cả các mô hình kế thừa từ ConvenienceModel mới của chúng tôi:

b45e29b9125c2ab565b5526442437686

Kết hợp các chức năng của riêng bạn với các mối quan hệ

Nếu bạn muốn nhận các mô hình được kết nối, bạn sử dụng cú pháp tiêu chuẩn để gọi chúng:

b45e29b9125c2ab565b5526442437686

Nếu bây giờ bạn thêm logic nghiệp vụ của riêng mình, bạn muốn sử dụng ký hiệu chữ hoa camel (thấp hơn):

b45e29b9125c2ab565b5526442437686

Chúng tôi muốn chuẩn hóa cú pháp của cả hai biến thể. Để làm điều này, chúng tôi thêm phương thức ma thuật __call vào ConvenienceModel:

b45e29b9125c2ab565b5526442437686

Cuộc gọi này do đó cũng có thể trong ví dụ trên:

b45e29b9125c2ab565b5526442437686

Kiểm tra các đối tượng trống

Nếu bạn muốn xuất tên quốc gia thành địa chỉ của một người, bạn sẽ thường thấy mã sau:

b45e29b9125c2ab565b5526442437686

Để ngăn chặn điều này, chúng tôi bao gồm thư viện stringhelpertrả về một đối tượng đặc biệt của lớp trống rỗng nếu không tìm thấy mô hình:

b45e29b9125c2ab565b5526442437686

Điều này cũng làm cho cuộc gọi thành công (trong ví dụ này, nếu thứ gì đó được tìm thấy, tên của quốc gia sẽ được xuất ra, trong tất cả các trường hợp khác là một chuỗi trống).

b45e29b9125c2ab565b5526442437686

Nếu chúng tôi cũng muốn đề cập đến trường hợp người dùng có ID 42 thậm chí có thể không tồn tại, chúng tôi cũng sẽ xây dựng một chức năng trợ giúp nhỏ cho việc này:

b45e29b9125c2ab565b5526442437686

Do đó, lệnh gọi sau cung cấp một chuỗi trống ngay cả khi người dùng hoàn toàn không tồn tại:

b45e29b9125c2ab565b5526442437686

Thuận tiện đi qua các quan hệ n: m

Cuối cùng, chúng tôi muốn đơn giản hóa đoạn mã sau:

b45e29b9125c2ab565b5526442437686

Đối với điều này, chúng tôi sử dụng khả năng của các bộ sưu tập tùy chỉnh . Đầu tiên chúng tôi mở rộng mô hình tiện lợi:

b45e29b9125c2ab565b5526442437686

Sau đó, chúng tôi tạo tệp app \ Helpers \ ConvenienceCollection.php , đảm bảo rằng việc gọi các hàm không xác định trong bộ sưu tập sẽ thực thi chức năng cho tất cả các mục trong bộ sưu tập:

b45e29b9125c2ab565b5526442437686

Vì vậy, chúng tôi có thể sử dụng mã sau để xuất ra tất cả các tên của tất cả các quốc gia, tất cả các địa chỉ của tất cả cha mẹ của người đó:

b45e29b9125c2ab565b5526442437686

Nhưng các cuộc gọi như sau cũng có thể:

b45e29b9125c2ab565b5526442437686

Sắp xếp theo nhiều cột

Cuộc gọi sau chỉ sắp xếp theo vị trí , mặc dù đó có thể không phải là điều bạn muốn:

b45e29b9125c2ab565b5526442437686

Để cho phép sắp xếp theo một số cột, chúng tôi đang mở rộng Bộ sưu tập Tiện lợi của mình:

b45e29b9125c2ab565b5526442437686

Với điều đó, chúng tôi có thể sắp xếp bộ sưu tập theo một số cột với:

b45e29b9125c2ab565b5526442437686

Phân loại tiêu chuẩn

Chúng tôi đang mở rộng Bộ sưu tập ConvenienceCollection với một chức năng phụ trợ khác:

b45e29b9125c2ab565b5526442437686

Bây giờ bạn có thể cung cấp cho mỗi mô hình một chức năng sắp xếp tiêu chuẩn riêng lẻ:

b45e29b9125c2ab565b5526442437686

Với điều này, chúng tôi có thể sắp xếp một bộ sưu tập với:

b45e29b9125c2ab565b5526442437686

Tên đối tượng

Mỗi mô hình triển khai phương thức getLabel (getName khác nhau tùy thuộc vào mô hình):

b45e29b9125c2ab565b5526442437686

Với điều này, bạn có thể nhanh chóng và dễ dàng hiển thị tên của một đối tượng. Sau đó, bạn có thể triển khai phương thức trình trợ giúp sortByLabel trong ConvenienceCollection:

b45e29b9125c2ab565b5526442437686

Kết quả trống

Nếu một bước trung gian trống, các hàm Laravel first () và last () thường trả về 0. Do đó, chúng tôi giới thiệu getFirst () và getLast () để cuộc gọi sau luôn thành công:

b45e29b9125c2ab565b5526442437686

Với điều này, chúng tôi gửi lại __empty_helper mà __x nhận ra:

b45e29b9125c2ab565b5526442437686

Trở lại