web-dev-qa-db-de.com

Speichern verwandter Datensätze in Laravel

Ich habe Benutzer und Benutzer gehören zu einem Händler. 

Bei der Benutzerregistrierung versuche ich, einen neuen Benutzer und einen neuen Händler zu speichern. 

Die Benutzerdatenbank enthält eine dealership_id-Spalte, die mit der ID des neu erstellten Händlers gefüllt werden soll. 

Dies ist mein aktueller Code in der Speichermethode UserController.

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, $user->Push(); zu verwenden, wird zwar aktualisiert, aber der Händler wird nicht erstellt oder aktualisiert. 

33

Eloquents Push() speichert das Modell und seine Beziehungen, aber zuerst müssen Sie sagen, was Sie in die Beziehung einbeziehen möchten.

Da Ihr Benutzermodell/Ihre Tabelle die ID des Autohauses enthält, gehe ich davon aus, dass ein Benutzer nur einem Autohaus angehören kann. Die Beziehung sollte daher folgendermaßen aussehen:

Benutzermodell:

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

Händlermodell:

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

Um einen Benutzer aus der Händlerperspektive zu speichern, führen Sie folgende Schritte aus:

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

So ordnen Sie einem Händler eine Verkaufsstelle zu:

$user->dealership()->associate($dealership);
$user->save();
48
Quasdunk

Bitte überprüfen Sie diese Antwort , um den Unterschied zwischen Push () und save () zu sehen.

Sie müssen Ihre Modelle Beziehungen gemäß der Dokumentation .__ richtig definieren. Wenn dies korrekt durchgeführt wird, sollte dies funktionieren. 

/**
 * 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 eine (Händler) zu vielen (Benutzer)

In Ihrem Benutzermodell: 

class Users extends Eloquent {

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

    }

}

Im obigen Beispiel sucht Eloquent nach einer dealership_id-Spalte in der Benutzertabelle. In Ihrem Händlermodell: 

class Dealership extends Eloquent {

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

}

In Ihrer Ladenfunktion: 

 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";

    }  

Erfahren Sie hier mehr über eloquente Beziehungen

Bitte nimm auch einen hier meine Antwort

6
Paul Bele

Durch die Verwendung von Push für das Benutzermodell ruft Laravel grundsätzlich alle zugehörigen Modelle rekursiv auf (was in diesem Fall keines ist, da Sie noch keine anderen Modelle zugeordnet haben).

Um das zu erreichen, was Sie zu erreichen versuchen, können Sie zuerst den Benutzer erstellen und dann den Händler mit diesem verknüpfen, indem Sie Folgendes tun:

$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";

Bevor Sie dies tun, müssen Sie jedoch sicherstellen, dass die Beziehungen Ihrer Benutzer- und Händlermodelle korrekt eingerichtet sind:

Benutzermodell:

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

Händlermodell:

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

So schaffe ich es.

In deinem Controller: (Laravel 5) 

use Auth;

$dealership->user = Auth::user()->ref_user->staff_id;