2016-08-09 3 views
0

Ich habe ein Formular, das Daten von Person und Adresse empfängt. Ich möchte bestimmte Daten in der Tabelle Person und in der Tabelle Address speichern.Laravel 5.1: Methode "create" Empfangen eines Datenbanches

Ich verwende die Methode "create" aus dem Person-Modell, um zuerst die Person zu erhalten, diese Methode erhält als Parameter ein Array von Daten (bezogen auf Person und Adresse). So bekomme ich einen Fehler "SQLSTATE [42S22]: Spalte nicht gefunden ...", weil versucht wird, Address Wert in Personentabelle einzufügen.

Wie geht man damit um?

Vielen Dank im Voraus.

+0

Benötigen Sie weitere Hilfe zu dieser Frage? – Alphonsus

+0

Mein Problem ist gelöst. Vielen Dank. –

Antwort

1

Sie sollten entweder die $ befüllbar oder $ bewacht Eigenschaft werden Einstellung auf Ihrem Modell des

zum Beispiel, wenn Sie Ihre Anfrage enthält die folgenden Daten:

[ 
    'name' => 'Bill Mickelson', 
    'street' => '123 Test Lane', 
    'city' => 'Baltimore', 
    'state' => 'Maryland' 
] 

und ‚name‘ bezieht sich auf Person, aber die anderen 3 beziehen sich auf die Adresse Sie die folgende ...

in person.php tun würde:

protected $fillable = [ 'name' ]; 

in Address.php:

protected $fillable = [ 'street', 'city', 'state' ]; 

Danach, wenn Sie erstellen() aufrufen, werden nur die in $ ausfüllbare angegebenen Felder ausgefüllt werden.

Als Nebenwirkung, können Sie auch nur $ bewacht gesetzt, um anzugeben, die nicht befüllbar sein sollte, das heißt, wenn jedes dieser Modells eine ‚id‘ hat und Sie wollen alles andere befüllbar sein, können Sie tun:

protected $guarded = [ 'id' ]; 
+0

Vielen Dank. Ich habe eine Viele-zu-Viele Beziehung. Ich mache: '$ person = PersonModel-> create ($ data); 'und dann' $ person-> address() -> save ($ data); 'Aber ich bekomme" QueryException in Connection.php Zeile 662: SQLSTATE [23000]: Verletzung der Integritätsbedingung: 1452 Hinzufügen oder Aktualisieren einer untergeordneten Zeile ..... " –

+0

Das Problem: Ich habe vergessen, das Adressobjekt zu instanziieren. Ich habe: '$ person = PersonModel-> create ($ data);' und dann '$ address = neue Adresse ($ adrsData);' und dann '$ person-> addresses() -> create ($ address);' Es speichert die Daten in der Tabelle Person, Address und PersonAddress. Aber ich habe zusätzliche Felder in der PersonAddress-Tabelle, z. B. den Adresstyp und den Personentyp. Ich habe versucht, die Methode attach() zu verwenden, aber keinen Erfolg. Kann jemand Daten in der Pivot-Tabelle speichern? Vielen Dank. –

+0

Die Lösung: '$ person-> address() -> save ($ address, ['address_type' => '1', 'person_type' => '2']); 'Es hat gut funktioniert. –

0

ich nehme an, Sie haben ein Person Modell mit hasOne oder hasManyAddress.

Sie sollten die Adressattribute nicht in der create-Methode Person übergeben. Was Sie stattdessen tun können, ist zuerst create die Person, dann speichern Sie ein Address Objekt im Zusammenhang mit dieser Person.

Zum Beispiel:

$formData = ['name' => 'John', 'age' => 25, 'country' => 'US']; 

$person = Person::create([ 
    'name' => $formData->name, 
    'age' => $formdata->age 
]); 

$address = new Address([ 
    'name' => $formData->country 
]); 

// Save $address related to $person 
// for ex. if Person hasOne Address: 
$person->address()->save($address); 

Siehe Inserting & Updating Related Models Abschnitt in der Dokumentation.