php - Laravel - Set Default Value for Relation Models -


मेरे पास एक टेबल खाता है:

  act_id, act_name, act_address  < / Pre> 

और मेरे पास एक टेबल पता है:

  add_id, add_street1, & lt; अन्य फ़ील्ड जिसे आप किसी एडेड टेबल में रखते हैं & gt;   

accounts.act_address addresses.add_id के लिए एक विदेशी कुंजी है। Laravel में, मेरा खाता मॉडल है:

  LaravelBook \ Ardent \ Ardent का उपयोग करें; प्रबुद्ध \ डाटाबेस का उपयोग करें \ Eloquent \ SoftDeletingTrait; क्लास खाता शख्सियत बढ़ाता है {सॉफ्टडेलिंगटेट का उपयोग करें; संरक्षित $ table = 'accounts'; संरक्षित $ primaryKey = 'act_id'; सार्वजनिक स्थिर $ नियम = सरणी ('act_name' = & gt; 'आवश्यक | अद्वितीय: खातों'); सुरक्षित $ fillable = सरणी ('act_name'); सार्वजनिक कार्य पता () {वापसी $ इस- & gt; हैन ('पता', 'एडी_आईडी', 'एक्ट_एड्रेस'); }}   

जैसा कि आप देख सकते हैं, यहां मेरे एक-से-एक रिलेशनशिप सेटअप है I (बेशक, पता मॉडल में एक 'समानता' भी है)। यह सब काम करता है।

यह बात है, पता विदेशी कुंजी नल है, क्योंकि खातों को पते की आवश्यकता नहीं होती है। इसलिए, अगर मैं खाता- & gt; पते तक पहुंचने की कोशिश करता हूं जब उसमें कोई नहीं होता है, तो मुझे 'गैर-ऑब्जेक्ट की संपत्ति का उपयोग करने की कोशिश' त्रुटि मिलेगी।

मुझे क्या चाहिए ऐसा करने के लिए खाता- & gt; पता एक नया पता ऑब्जेक्ट (सभी फ़ील्ड रिक्त) को सेट करते हैं, अगर खाता रिकॉर्ड में एक सेट नहीं होता है।

मैं क्या कर रहा हूं या तो मॉडल में दूसरी विधि:

  सार्वजनिक फ़ंक्शन getAddress () {रिक्त ($ this- & gt; पते) लौटें? नया पता (): $ this- & gt; पता; }   

या, इसे उड़ने पर जोड़ें:

  यदि (खाली ($ खाता- & gt; पता)) $ account- & gt; पता = नया पता ();   

पहला समाधान सचमुच करीब है, लेकिन मैं वास्तव में एक विधि के बजाय संपत्ति के रूप में पते को एक्सेस करने की कार्यक्षमता को रखना चाहता हूं।

, मेरा प्रश्न यह है:
खाता- & gt; पता खाली / शून्य है, तो मैं खाता- & gt; पते का नया पता () कैसे लौटा सकता हूं?

ओह, और मैंने ओवरराइड करने का प्रयास किया $ विशेषताओं की तरह:

  सुरक्षित $ attributes = array ('address' = & gt; नया पता ());   

लेकिन यह एक त्रुटि फेंकता है।

एक्सेसर का उपयोग करें: < / P>

संपादित करें: चूंकि यह संबंधित है नहीं हैअन संबंध, यह थोड़ा मुश्किल है - आप एक मॉडल को गैर-मौजूदा से संबद्ध नहीं कर सकते एक के लिए, बाद में आईडी नहीं है :

  सार्वजनिक फ़ंक्शन getAddressAttribute () (यदि (! Array_key_exists ('address', $ this- & gt; relations)) $ this-> gt ; लोड ( 'पता'); $ पता = ($ इस- & gt; getRelation ('पता'))?: $ This- & gt; getNewAddress (); वापसी का पता; } सुरक्षित फ़ंक्शन getNewAddress () {$ पता = $ this- & gt; पता () - & gt; getrelated (); $ The- & gt; सेटरेलेशन ('पता', $ पता); वापसी का पता; }   

हालांकि, अब आपको इसकी आवश्यकता है:

  $ account- & gt; पता- & gt; सहेजें (); $ खाते- & gt; पता () - & gt; सहयोगी ($ खाते- & gt; पते);   

जो बहुत सुविधाजनक नहीं है आप वैकल्पिक रूप से getNewAddress पद्धति में नए तत्काल पते को सहेज सकते हैं या खाते को स्वचालित रूप से संबद्ध करने के लिए खाता सहेजें ओवरराइड कर सकते हैं वैसे भी इस रिश्शन के लिए मुझे यकीन नहीं है कि यह करने के लिए समझ में आता है .. hasOne के लिए यह अच्छा खेलना होगा।


नीचे कैसे तरीका है यह hasOne संबंध के लिए दिखना चाहिए:

  सार्वजनिक फ़ंक्शन getAddressAttribute () (यदि (! Array_key_exists ('address', $ this- & gt; संबंध )) $ इस- & gt; लोड ('पता'); $ पता = ($ इस- & gt; getRelation ('पता'))?: $ This- & gt; getNewAddress (); वापसी का पता; } सुरक्षित फ़ंक्शन getNewAddress () {$ पता = $ this- & gt; पता () - & gt; getrelated (); $ इस- & gt; associateNewAddress ($ पते); वापसी का पता; } संरक्षित फ़ंक्शन सहयोगीनईएड्रेसर ($ पता) {$ विदेशीकी = $ इस- & gt; पता () - & gt; getPlainForeignKey (); $ पता- & gt; {$ foreignKey} = $ this- & gt; getKey (); $ The- & gt; सेटरेलेशन ('पता', $ पता); }   

आप यह सब एकल एक्सेसर में कर सकते हैं, लेकिन यह ऐसा तरीका है जिसे दिखना चाहिए।

Comments

Popular posts from this blog

Out of index C/C++ -

regex - PatternSyntaxException: while using String.ReplaceAll function in java? -

java - Projects which are accessed via multiple (different) IDEs: Ant or Maven? -