2013-03-07 42 views
13

Tôi đang sử dụng Laravel, điều này thật tuyệt vời, nhưng tôi đang gặp vấn đề với cơ sở dữ liệu.Làm thế nào để chuỗi các mối quan hệ DB trong Laravel (nhiều has_many?)

Hãy nói rằng chúng tôi có ba bảng, như vậy:

BẢNG 1: trang

id | route | title 

BẢNG 2: yếu tố

id | page_id | type 

BẢNG 3: Nội dung

id | element_id | data 

Tôi muốn thực hiện một lựa chọn duy nhất cho trang sẽ lần lượt chọn tất cả các phần tử có id trang đó và cho mỗi phần tử, nó sẽ chọn tất cả các hàng nội dung có id phần tử .

Tôi muốn có chức năng tĩnh load_by_route ($ route) trong mô hình Trang, khi được gọi, sẽ sử dụng tuyến đường để tải và trả lại thông tin trang cũng như các yếu tố và nội dung như mô tả ở trên. Lý tưởng nhất nó sẽ trả về một đối tượng/mảng duy nhất với tất cả các thông tin này.

Về cơ bản, tôi không chắc chắn cách kết nối các cuộc gọi has_many() với nhau để tôi có được mối quan hệ hai cấp.

+1

chỉ cần giữ khi tham gia tất cả các bảng. bạn đã thử bất kỳ SQL nào chưa? – Randy

+3

Tôi đang viết tất cả bằng cách sử dụng Eloquent của Laravel: http://laravel.com/docs/database/eloquent, thay vì SQL thẳng. – Pete

Trả lời

30

Nhìn vào tải dữ dội. Điều này sẽ làm những gì bạn muốn.

class Page extends Eloquent { 

    public function elements() 
    { 
     return $this->has_many('Element'); 
    } 

} 

class Element extends Eloquent { 

    public function contents() 
    { 
     return $this->has_many('Content'); 
    } 

} 

class Content extends Eloquent {} 

$page = Page::with(array('elements', 'elements.contents'))->first(); 

https://laravel.com/docs/master/eloquent-relationships#eager-loading

+0

Tuyệt vời, cảm ơn! Tôi đã không nhận ra rằng đó là thuật ngữ tôi cần tìm kiếm - tôi chỉ đọc tất cả các phần về mối quan hệ. Cảm ơn! – Pete

+1

Chỉ cần lưu ý ở đây, cách tiếp cận này không liên kết với nhau. Nó háo hức nạp các bản ghi mô hình con, nhưng vẫn được thực hiện thông qua một loạt các truy vấn riêng biệt khi 'Trang' được tìm nạp. – Jason

+0

Tải xuống có nhiều mối quan hệ (từ [5.3 tài liệu] (https://laravel.com/docs/5.3/eloquent-relationships#eager-loading)) - $ books = App \ Book :: với ('tác giả', ' publisher ') -> get(); – kerrin

Các vấn đề liên quan