2016-04-03 4 views
6

Ich habe ein Modell Foo, die einer Tabelle mit den folgenden Spalten entspricht.Laravel Eloquent ignorieren Attribut, wenn nicht in der Tabelle während der Einfügung

id
Beschreibung
User_id

ich die Attribute des Foo-Modells individuell bin Einstellung (keine Massenzuordnung)

$foo = new Foo; 

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

//... 

$ foo zur weiteren Verarbeitung in einer anderen Klasse gesendet wird, aber Da diese Klasse ein bisschen mehr Informationen benötigt, möchte ich sie einfach zum $ foo-Modell hinzufügen.

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

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

$foo->save(); //error 

das Problem ist, wenn ich $foo->save(), wirft sie bar keine Spalte ist.

Ich weiß, ich kann unset($foo->bar); vor dem Speichern, aber ...

Ist es möglich, Eloquent zu sagen, einfach alle nicht relevanten Attribute zu ignorieren?

+0

Ich denke, die $ füllbare Variable von Eloquent kann Ihnen hier helfen: http://stackoverflow.com/questions/20620364/can-eloquent-ignore-irrelevant-data-in-laravel-4 –

+0

Ich sah das, aber ich dachte $ befüllbar wäre nur für Massenaufträge. Ich schätze, ich könnte einfach ein Array erstellen und dieses übergeben, anstatt jedes Attribut einzeln zuzuweisen ... '$ foo = new Foo ($ array);' – dangel

Antwort

0

Fügen Sie das $ fillable hinzu und das Modell ignoriert alles, was nicht darin enthalten ist (anstatt einen Fehler zu geben). Die Verwendung der Konstruktorfunktion zum Füllen aller Spalten ist optional.

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

Sieht aus, als würde die Verwendung von '$ fillable' nicht nur verhindern, dass dieser Wert gespeichert wird an die DB, aber es behält auch das Attribut an erster Stelle gesetzt. Mit anderen Worten, es wird nicht ganz funktionieren, da ich dieses Attribut an eine andere Klasse weitergeben muss, aber nur nicht gespeichert. – dangel

1

Ich weiß es zu spät ist, aber Sie können die saving Betrieb durch Überschreiben Sie die boot Funktion in Ihrem Modell registrieren:

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)); 
     } 
    }); 
} 

Dieser ungetesteten Code ist, aber die Idee ist es, die Attribute zu entfernen die sich vor dem Speichern des Modells nicht mit der Variablen savable überschneiden. Die Variable savable ist ein Array der speicherbaren Attribute. Beispiel: $savable = ['foo', 'bar'] speichert nur die Attribute foo und bar.

Vorteile: Sie können mass alle Attribute, die Sie wollen, ohne Schaden an fillable oder guarded zuweisen.

Nachteile: Die Attribute, die nicht als savable markiert sind, werden nach dem Speichern aus dem Modell gelöscht.

Verwandte Themen