2017-01-07 9 views
5

तो मेरे पास यह पागल विचार है जिसे लैरावेल और मॉडल विरासत के साथ करना है। मैं एक एकल माता-पिता के साथ मॉडल का एक सेट कॉन्फ़िगर करना चाहता हूं लेकिन जब मैं बाल मॉडल का अनुरोध करता हूं तो मुझे डेटा वापस लौटाया जाएगा। उदाहरण के लिए मेरे पास एक संपर्क मॉडल होगा जो माता-पिता है:लार्वेल 5 मॉडल विरासत - बच्चे मोड प्राप्त करते समय मूल डेटा लौटा

Contacts: id, first_name, last_name, image

तब मेरे पास संपर्क प्रकारों की एक श्रृंखला होगी जो संपर्कों से प्राप्त होती है। इन बाल मॉडलों में से प्रत्येक के पास अपने स्वयं के खेतों का सेट होगा (यानी सदस्यों के लिए मुझे पता होना चाहिए कि वे कब शामिल हुए हैं, आदि। लेकिन स्वयंसेवकों के लिए मुझे यह जानने की आवश्यकता हो सकती है कि उनके पास एक अद्यतित प्राथमिक चिकित्सा प्रमाण पत्र है या नहीं)। यहाँ कुछ उदाहरण हैं:

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

मैं की तरह कुछ करने के लिए सक्षम होने के लिए प्यार होता है:

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

और संपर्क करें और सदस्य डेटा नहीं दिया है कि सब कुछ एक पंक्ति थी, इस तरह है:


+---+------------+-----------+-------+------------+------------+------------------+ 
|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    | 
+---+------------+-----------+-------+------------+------------+------------------+ 

और इसे थोड़ा और कठिन बनाने के लिए मैं माता-पिता को बच्चे के लिए काम करने के लिए लागू सभी रिश्तों को पसंद करूंगा। भले ही सदस्य मॉडल एक रिश्ता फोन मॉडल यह संपर्क से संबंधित फोन वापसी होगी क्योंकि माता पिता है कि संबंध नहीं है करने के लिए परिभाषित नहीं है

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

और,: तो मैं कुछ इस तरह कर सकता है।

मैं भी और नहीं कॉलम है कि जब डेटा पुन: प्राप्त बच्चे से संबंधित नहीं है निर्दिष्ट करने के लिए सक्षम होने के लिए Laravel एक त्रुटि फेंक है चाहते हैं:

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

मैं चारों ओर सुवक्ता मॉडल अधिभावी के साथ गड़बड़ कर दिया है और सभी का अपना संस्करण लिखना और उन तरीकों को ढूंढना जो काम कर रहे हैं लेकिन ऐसा लगता है कि मुझे इसे काम करने के लिए सभी विधियों को ओवरराइड करना पड़ सकता है और हो सकता है कि यह सिर्फ वांछित होने और अन्य की तलाश करने से अधिक काम करेगा (या मेरा खुद bespoke) समाधान।

तो मुझे लगता है कि मेरे प्रश्न हैं: क्या लैरवेल के साथ ऐसा करने का एक "आसान" तरीका है या क्या मैं इसे ऐसा करने की कोशिश कर रहा हूं जिसे कभी करने का इरादा नहीं था?

उत्तर

0

मुझे लगता है कि आप इस तरह से कर सकते हैं:

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

अपने सदस्यों मॉडल संपर्क मॉडल के लिए belongsTo संबंध में परिभाषित किया जाना चाहिए था।

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?

हां।

एलोक्वेंट इस तरह से विरासत का प्रबंधन नहीं करते हैं। इसके बजाय polymorphic relations लागू करना बेहतर हो सकता है।

हालांकि, सिर्फ इस बिट अधिभावी अपने उद्देश्यों की सेवा के लिए लगता है:

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 है और अन्य उपवर्गों इस वर्ग का विस्तार (या प्रत्येक वर्ग कि Contact फैली में इन ओवरराइड जोड़ें)।

(मैंने इसे पूरी तरह से परीक्षण नहीं किया है, इसे आज़माएं।इसके अलावा, यह उत्सुक भार को सीधे संभाल नहीं पाएगा; अगर आप इसका समर्थन करना चाहते हैं तो ओवरराइड करने का प्रयास करें।)

संबंधित मुद्दे