2014-04-22 15 views
25

Ich habe Benutzer und Benutzer gehören zu einem Händler.Verwandte Datensätze in Laravel speichern

Nach Benutzerregistrierung versuche ich einen neuen Benutzer und einen neuen Händler zu speichern.

Benutzerdatenbank hat eine dealership_id Spalte, die ich mit der ID des neu erstellten Autohauses füllen möchte.

Dies ist mein aktueller Code in der UserController Speichermethode.

public function store() 
{ 
    $user = new User(); 
    $user->email = Input::get('email'); 
    $user->password = Input::get('password'); 


    $dealership = new Dealership(); 
    $dealership->name = Input::get('dealership_name'); 

    $user->push(); 
    return "User Saved"; 

} 

Der Versuch wird $user->push(); Benutzerdaten verwenden aktualisiert, aber Händler wird nicht erstellt oder aktualisiert.

+0

Welcher Teil des Codes erhalten ist die Händler-ID? – ajtrichards

+0

Tut mir leid, es wäre hilfreich, wenn ich auch Code von meinen Modellen beifüge, nehme ich an, haha. http://laravel.io/bin/N7Pm – BeardedInBindary

Antwort

35

Eloquent des push() speichert das Modell und seine Beziehungen, aber zuerst müssen Sie sagen, was Sie in der relationsship beteiligt werden soll.

Da Ihre Benutzer-Modell/Tabelle, die die ID des Händlers hält, gehe ich davon aus, dass ein Benutzer nur einen Händler gehören kann, so dass die Beziehung sollte wie folgt aussehen:

Benutzermodell:

public function dealership() 
{ 
    return $this->belongsTo('Dealership'); 
} 

Dealership Modell:

public function users() 
{ 
    return $this->hasMany('User'); 
} 

Um einen Benutzer zu speichern von th e Dealership Perspektive, die Sie dies tun:

$dealership->users()->save($user); 

Um einen Händler mit einem Benutzer zuordnen, können Sie dies tun:

$user->dealership()->associate($dealership); 
$user->save(); 
+0

Danke! Ich habe das Gefühl, dass mich das näher gebracht hat ... Ich habe versucht, das Beispiel zu verwenden, um einen Händler mit einem Benutzer zu verbinden und diesen Fehler zu erhalten "Illuminate \ Database \ QueryException SQLSTATE [23000]: Verletzung Integritätsbedingung: 1048 Spalte 'dealership_id' kann nicht sei null (SQL: Einfügen in 'user' (' email', 'passwort',' dealership_id', 'updated_at',' created_at') Werte ([email protected], y $ mItUgj2h4JiMi666a3DHROHahjZuRDcgqCaMVDAO..TpurSMVJnWG,, 2014-04 -22 19:59:56, 2014-04-22 19:59:56)) " – BeardedInBindary

+0

Also ich weiß, dass ich die dealership_id in die Benutzer-Tabelle bekommen muss, nicht sicher, wie das geht. Ich habe keine Fremdschlüsselreferenz für meine Migration für die Benutzertabelle eingerichtet. Könnte das Hinzufügen einer Fremdschlüsselregel dies automatisch beheben? Danke noch einmal! – BeardedInBindary

+2

@SteveBalistreri Ich denke, du musst den neuen Händler zuerst speichern(), bevor du ihn assoziierst :) 'new Dealership()' erstellt ein Objekt, speichert es aber noch nicht, also hat es keine ID. Sie müssen die Speichermethode manuell aufrufen. Alternativ können Sie es mit 'create()' tun: 'Dealership :: create (array ('name' => Eingabe :: get ('dealership_name')));' Dies speichert automatisch das neu erstellte Objekt, so dass es eine ID hat mit assoziieren. – Quasdunk

6

Bitte überprüfen this answer den Unterschied von Push zu sehen() und save()

Sie definieren müssen korrekt Ihre Modelle relationships as per documentation Wenn dies richtig gemacht wird, sollte es funktionieren. Diese ist, was push() tut:

/** 
* Save the model and all of its relationships. 
* 
* @return bool 
*/ 

    public function push() 
    { 
     if (! $this->save()) return false; 

     // To sync all of the relationships to the database, we will simply spin through 
     // the relationships and save each model via this "push" method, which allows 
     // us to recurse into all of these nested relations for the model instance. 

     foreach ($this->relations as $models) 
     { 
      foreach (Collection::make($models) as $model) 
      { 
       if (! $model->push()) return false; 
      } 
     } 

     return true; 
    } 

In Ihrem Fall haben Sie einen ein (Autohaus) gehört zu viele (Benutzer)

In Ihrem Benutzermodell:

class Users extends Eloquent { 

    public function dealership() 
    { 
     return $this->belongsTo('Dealership'); 

    } 

} 

In Im obigen Beispiel wird Eloquent in der Tabelle users nach einer Spalte "dealership_id" suchen. In Ihrem Dealership Modell:

class Dealership extends Eloquent { 

    public function users() 
    { 
     return $this->hasMany('User'); 
    } 

} 

In Ihrer Shop-Funktion:

public function store() 
    { 
     $user = new User(); 
     $user->email = Input::get('email'); 
     $user->password = Input::get('password'); 


     $user->dealership = new Dealership(); 
     $user->dealership->name = Input::get('dealership_name'); 

     $user->push(); 
     return "User Saved"; 

    } 

hier Weiteren Infos zu eloquent relationships

Auch klicken look at my answer here

+0

Danke, ich denke, ich habe meine eloquenten Beziehungen richtig eingerichtet. Ich habe hier eine Paste gemacht [link] (http://laravel.io/bin/N7Pm). Die Benutzertabelle hat eine Spalte "Händler_ID". Scheint immer noch nicht, den Autohaus zu erstellen und die Händler-ID dem Benutzer zuzuordnen. – BeardedInBindary

+0

Aktualisiert, bitte werfen Sie einen Blick auf meine Antwort hier: http://stackoverflow.com/questions/23183394/creating-new-record-and-relationships-in-one-go/23185225#23185225. Was ich denke, und aus Beispielen, es stellt sich heraus, dass Sie zuerst das Basismodell (d. H.) Den Benutzer speichern müssen, und die Verwendung push() zu aktualisieren –

+1

Ja, push() funktioniert nicht mit neuen Datensätzen. Siehe dieses Problem: https://github.com/laravel/framework/issues/4641 Und wenn man bedenkt, dass push() nicht viel dokumentiert ist, scheint es sicherer zu sein, save() zu verwenden. – JustAMartin

1

Druck auf dem User-Modell Durch die Verwendung von , Laravel rezitiert im Grunde rekursiv alle verwandten Modelle (was in diesem Fall keins ist, da Sie hav noch keine anderen Modelle zugeordnet).

Deshalb, um zu erreichen, was Sie zu tun versuchen, können Sie der Benutzer dann die Händler mit ihm, indem Sie die folgenden erstelle zuerst gefunden:

$user = new User(); 
$user->email = Input::get('email'); 
$user->password = Input::get('password'); 
$user->save(); 

$dealership = new Dealership(); 
$dealership->name = Input::get('dealership_name'); 

$user->dealerships()->save($dealership); 
return "User Saved"; 

jedoch vor dies zu tun,

Benutzermodell:

public function dealership() 
{ 
    return $this->belongsTo('Dealership'); 
} 

Dealership: Sie müssen Ihre Benutzer und Dealership Modelle haben ihre Beziehungen korrekt konfiguriert gewährleisten

public function users() 
{ 
    return $this->hasMany('User'); 
} 
+0

Was ist, wenn Sie verwandte Daten speichern/neuen Datensatz mit push() anstelle von save() einfügen, ist das möglich? –

+0

push() funktioniert nicht mit neuen Datensätzen. Siehe dieses Problem: https://github.com/laravel/framework/issues/4641 Und wenn man bedenkt, dass push() nicht viel dokumentiert ist, scheint es sicherer zu sein, save() zu verwenden. – JustAMartin

Verwandte Themen