2016-04-03 6 views
6

के दौरान तालिका में नहीं है मेरे पास एक मॉडल Foo है जो निम्न कॉलम वाले तालिका से मेल खाता है।लारवेल एलोक्वेंट विशेषता को अनदेखा करते हैं यदि सम्मिलित

आईडी
वर्णन
user_id

मैं फू मॉडल की विशेषताओं को व्यक्तिगत रूप से (कोई बड़े पैमाने पर काम)

$foo = new Foo; 

$foo->id = 1; 
$foo->description = "hello kitty"; 
$foo->user_id = 55; 

//... 

$ foo अतिरिक्त संसाधन के लिए एक और वर्ग के लिए भेज दिया जाता है, सेट कर रहा हूं लेकिन क्योंकि उस वर्ग को थोड़ी अधिक जानकारी चाहिए, मैं इसे $ foo मॉडल में जोड़ना चाहता हूं।

//... 
$foo->bar = $additional_information; 

Event::fire(DoStuffWithFoo($foo)); 

$foo->save(); //error 

समस्या जब मैं $foo->save(), यह शिकायत है कि bar एक स्तंभ नहीं है।

मैं जानता हूँ कि मैं सहेजने से पहले unset($foo->bar); कर सकते हैं, लेकिन ...

यह सुवक्ता बताने के लिए बस किसी भी गैर प्रासंगिक विशेषताओं की उपेक्षा करना संभव है?

+0

मुझे लगता है कि सुवक्ता की $ fillable चर तुम यहाँ चाहते मदद कर सकते हैं: http://stackoverflow.com/questions/20620364/can-eloquent-ignore-irrelevant-data-in-laravel-4 –

+0

मुझे लगता है कि देखा था, लेकिन मैंने सोचा कि $ fillable सिर्फ बड़े पैमाने पर असाइनमेंट के लिए था। मुझे लगता है कि मैं सिर्फ एक सरणी बना सकता हूं और प्रत्येक विशेषता को व्यक्तिगत रूप से असाइन करने के बजाय पास कर सकता हूं ... '$ foo = new foo ($ array);' – dangel

उत्तर

0

$ भरने योग्य जोड़ें और मॉडल इसमें सबकुछ अनदेखा नहीं करेगा (त्रुटि देने के बजाय)। सभी कॉलम भरने के लिए कन्स्ट्रक्टर फ़ंक्शन का उपयोग करना वैकल्पिक है।

class Foo extends Model 
{ 
    protected $fillable = ['id', 'description', 'user_id']; 
} 

$f = new Foo(['id' => 1, 'description' => "hello monkey", 'user_id' => 55, 'bar' => 'wow']); // should work w/o error, but it ignores the 'bar'. 
+3

'$ fillable' का उपयोग करने जैसा लगता है न केवल उस मूल्य को सहेजने के किसी भी प्रयास को रोकता है डीबी के लिए, लेकिन यह विशेषता को पहले स्थान पर सेट करने से भी रोकता है। तो दूसरे शब्दों में यह काफी काम नहीं करेगा क्योंकि मुझे उस विशेषता को किसी अन्य वर्ग में पारित करने की आवश्यकता है, लेकिन अभी सहेजा नहीं गया है। – dangel

1

मैं बहुत देर हो चुकी है, लेकिन आप अपने मॉडल में saving आपरेशन ओवरराइड द्वारा पंजीकृत कर सकते हैं boot समारोह:

protected static function boot() { 
    parent::boot(); 

    static::saving(function($model) { 
     $savable = [...]; 
     if (count($savable) > 0) { 
      $model->attributes = array_intersect_key($model->attributes, array_flip($savable)); 
     } 
    }); 
} 

यह अपरीक्षित कोड है, लेकिन विचार विशेषताओं को दूर करने के लिए है जो मॉडल को सहेजने से पहले परिवर्तनीय savable से अंतर नहीं करता है। परिवर्तनीय savable savable विशेषताओं की एक सरणी है। उदाहरण के लिए $savable = ['foo', 'bar'] केवल foo और bar विशेषताएँ बचाएगा।

पेशेवर: आप fillable या guarded को नुकसान पहुंचाए बिना किसी भी विशेषता को बड़े पैमाने पर असाइन कर सकते हैं।

विपक्ष: savable के रूप में चिह्नित नहीं किए गए गुण, सहेजने के बाद मॉडल से हटा दिए जाएंगे।

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