2017-01-07 23 views
5

Vì vậy, tôi có ý tưởng điên rồ này liên quan đến Laravel và kế thừa mô hình. Tôi muốn cấu hình một tập hợp các mô hình với một phụ huynh duy nhất nhưng khi tôi yêu cầu mô hình con tôi muốn dữ liệu được trả về. Ví dụ: tôi sẽ có mô hình Danh bạ là cha mẹ:Laravel 5 Kiểu thừa kế - trả lại dữ liệu gốc khi nhận được chế độ con

Contacts: id, first_name, last_name, image

Sau đó, tôi sẽ có một loạt loại liên hệ kế thừa từ Danh sách liên hệ. Mỗi mô hình con này sẽ có bộ trường riêng của họ (tức là đối với các thành viên tôi cần biết khi họ tham gia, vv. Nhưng đối với các tình nguyện viên, tôi có thể cần biết liệu họ có giấy chứng nhận cấp cứu mới nhất) hay không. Dưới đây là một vài ví dụ:

Members: contact_id, joined_on, birthday, medical_concerns 
Volunteers: contact_id, current_first_aid, interests 
Staff: contact_id, pay_rate 

Tôi rất thích để có thể làm điều gì đó như:

$members = \App\Member::all();

và có dữ liệu liên lạc VÀ viên trở, nếu như tất cả mọi thứ là một hàng, như thế này:


+---+------------+-----------+-------+------------+------------+------------------+ 
|id | first_name | last_name | image | joined_on | birthday | medical_concerns | 
+---+------------+-----------+-------+------------+------------+------------------+ 
| 1 | Fred  | Bloggs | null | 2015-01-01 | 1993-10-22 | false   | 
| 2 | Jim  | Phillips | null | 2016-04-30 | 1987-09-22 | true    | 
+---+------------+-----------+-------+------------+------------+------------------+ 

Và để làm cho nó khó khăn hơn một chút, tôi muốn tất cả các mối quan hệ áp dụng cho phụ huynh làm việc cho trẻ. Vì vậy, tôi có thể làm một cái gì đó như thế này:

$members = \App\Member::find(1)->phone

Và, mặc dù mô hình thành viên không có mối quan hệ được xác định với mô hình điện thoại nó sẽ trả lại điện thoại liên quan đến Liên vì phụ huynh có mối quan hệ đó.

Tôi cũng muốn để có thể xác định các cột mà không thuộc về đứa trẻ khi lấy dữ liệu và không có Laravel ném một lỗi:

$members = \App\Member::all(['first_name','last_name','joined_on']) 

Tôi đã sai lầm xung quanh với trọng các mô hình hùng hồn và viết phiên bản của riêng tôi của tất cả và tìm các phương pháp đang hoạt động nhưng có vẻ như tôi có thể phải ghi đè tất cả các phương pháp để làm việc này và có thể sẽ hoạt động nhiều hơn chỉ Eloquent forgoing và tìm kiếm khác (hoặc của riêng tôi bespoke) giải pháp.

Vì vậy, tôi đoán câu hỏi của tôi là: Có cách nào "dễ dàng" để làm điều này với Laravel hay tôi đang cố gắng làm cho nó làm những việc mà nó không bao giờ có ý định làm?

Trả lời

0

Tôi nghĩ rằng bạn có thể làm như thế này:

$members = \App\Members::with('contact')->all(); 

Tất nhiên mô hình thành viên của bạn nên đã xác định mối quan hệ belongsTo với mô hình liên lạc.

0

Is there an "easy" way to do this with Laravel or am I trying to make it do things that it was never intended to do?

Có.

Eloquent doen't quản lý kế thừa theo cách này. Thay vào đó, tốt hơn nên triển khai polymorphic relations.

Tuy nhiên, trọng chỉ bit này dường như để phục vụ mục đích của bạn:

abstract class ContactSubclass extends Contact 
{ 
    protected $with = 'parent'; 

    public function parent() 
    { 
     return $this->belongsTo(Contact::class, 'contact_id'); 
    } 

    public function newQuery() 
    { 
     $contactTable = (new Contact())->getTable(); 
     $thisTable = (new static())->getTable(); 

     $builder = parent::newQuery(); 
     $builder->join($contactTable, "$thisTable.contact_id", '=', "$contactTable.id"); 

     return $builder; 
    } 

    public function newFromBuilder($attributes = [], $connection = null) 
    { 
     $model = parent::newFromBuilder($attributes, $connection); 

     if ($model->parent) { 
      $model->setRawAttributes(array_merge($model->parent->getAttributes(), $model->getAttributes()), true); 
     } 

     return $model; 
    } 

    protected function getRelationshipFromMethod($method) 
    { 
     if (method_exists(parent::class, $method)) { 
      return $this->parent->getRelationshipFromMethod($method); 
     } 

     return parent::getRelationshipFromMethod($method); 
    } 
} 

Member và lớp con khác mở rộng lớp này (hoặc thêm các ghi đè trong mỗi lớp kéo dài Contact).

(Tôi chưa thử nghiệm kỹ lưỡng, hãy thử.Ngoài ra, điều này sẽ không xử lý tải mong muốn trực tiếp; cố gắng tìm những gì cần ghi đè nếu bạn muốn hỗ trợ điều đó.)

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