2016-11-30 6 views
2

Ich versuche, Daten mit Laravel firstOrNew Methode zu speichern, die eine MassAssignmentException Fehler erzeugt.Laravel MassAssignmentException von FirstOrNew von ID

Ich verstehe nicht, warum die firstOrNew Methode eine Massenzuweisung Ausnahme auslösen sollte, da es nur auf der Datenbank suchen, nicht versucht, etwas zu speichern. Von the docs:

Die firstOrNew Methode, wie firstOrCreate versuchen, einen Datensatz in der Datenbank zu finden, die gegebenen Attribute entsprechen. Wenn jedoch kein Modell gefunden wird, wird eine neue Modellinstanz zurückgegeben. Beachten Sie, dass das von FirstOrNew zurückgegebene Modell noch nicht in der -Datenbank gespeichert wurde.

Warum soll mein Code eine MAE werfen:

$tour = Tour::firstOrNew(array('id' => $this->request['id'])); 

Wie ich verstehe, alles, was der oben genannte Code zu sagen „ist im Grunde schauen und sehen, ob es eine Zeile in der Datenbank mit diese ID, wenn ja, dann gebe die Zeile zurück, wenn nicht, dann erzeuge ein neues Objekt mit den relevanten Eigenschaften ". Es speichert keine Daten, was ist das Problem?

Beachten Sie, dass der Fehler nur auftritt, wenn die Zeile nicht vorhanden ist.

+1

Sie versuchen, ein Objekt zu erstellen, indem Sie eine ID. In Ihrem Fall ist das vielleicht in Ordnung, aber normalerweise wird ID automatisch erhöht, sodass Sie keinen bestimmten Wert erstellen möchten. Ich würde zuerst ein Objekt nach einem anderen Attribut suchen - wenn der Name existiert, schnappe es, sonst erzeuge ich ein Objekt mit diesem Namen. Du könntest auch darüber nachdenken, in findOrFail nachzusehen, was passender klingt https://laravel.com/docs/5.3/eloquent#retrieving-single-models - existiert ein Objekt mit dieser ID? Wenn ja, bekomme es sonst eine Exception – Djave

+0

Danke, obwohl 'findOrFail' wahrscheinlich nicht geeignet ist, da laut den Docs es automatisch ein 404 schickt, was ich nicht will. ID ist in der Tat automatisch inkrementierend und ist die einzige Spalte, die garantiert eindeutig ist, weshalb ich sie verwenden wollte. Nicht sicher, wie man das dann macht .... – Inigo

+0

Ja ich höre dich. Die Antwort von Alexey Mezenin deckt alle Gründe ab, warum es scheitert. Wenn Sie eine einfache Fahrt wollten, bin ich mir ziemlich sicher '$ tour = Tour :: find ($ this-> request ['id']); if (! $ tour) $ tour = neue Tour; 'wäre ein wirklich schmerzfreier Weg, um an den gleichen Ort zu kommen. Viel Glück! – Djave

Antwort

4

firstOrNew() verwendet newInstance(), die mit Konstruktor neues Modell erstellt. Constructor uses fill() Methode, die Mass Assigment ist. Deshalb bekommst du eine Ausnahme.

So müssen Sie $fillable Array setzen firstOrNew() verwenden

+1

Ah, OK. * Der Konstruktor verwendet die fill() -Methode, die Mass Assigment ist. * Das ist der Schlüssel, denke ich. – Inigo

1

MassAssignmentException tritt auf, wenn Sie nicht befüllbar oder bewacht Felder in der

$guarded = []; 
$fillable = ['explicitlydefinedfield']; 

PS

Modell definiert: Sie können den Text kopiert haben, die genau sagt, was passiert ... es nicht den Datensatz gefunden und ist versuchen, ein neues zu schaffen.

firstOrNew ... NEW

+0

Danke, ich bin mir bewusst, die "bewachten" und "fillable" -Attribute zu setzen, ich verstehe einfach nicht, warum sie notwendig sind, wenn Daten nicht in der Datenbank gespeichert werden (dh gespeichert) – Inigo

+0

Ich denke, die nächste Antwort adressiert, dass besser :) –

Verwandte Themen