web-dev-qa-db-fra.com

Enregistrement des enregistrements associés dans laravel

J'ai des utilisateurs, et les utilisateurs appartiennent à un concessionnaire. 

Lors de l'inscription d'un utilisateur, j'essaie de sauvegarder un nouvel utilisateur et un nouveau concessionnaire. 

La base de données utilisateur contient une colonne dealership_id que je souhaite renseigner avec l'ID du concessionnaire nouvellement créé. 

Ceci est mon code actuel dans la méthode de stockage 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";

}

Essayer d'utiliser $user->Push(); Les données utilisateur sont mises à jour, mais le concessionnaire n'est ni créé ni mis à jour. 

33
BeardedInBindary

Push() d'Eloquent enregistre le modèle et ses relations, mais vous devez d'abord indiquer ce que vous voulez faire participer à la relation.

Puisque votre modèle/table utilisateur contient l'identifiant du concessionnaire, je suppose qu'un utilisateur ne peut appartenir qu'à un seul concessionnaire. La relation doit donc ressembler à ceci:

Modèle d'utilisateur:

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

Modèle de concession:

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

Pour enregistrer un utilisateur du point de vue du concessionnaire, procédez comme suit:

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

Pour associer un concessionnaire à un utilisateur, procédez comme suit:

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

Veuillez vérifier cette réponse pour voir la différence entre Push () et save ()

Vous devrez définir correctement vos relations modèles conformément à la documentation Si cela est fait correctement, cela devrait fonctionner . 

/**
 * 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;
    }

Dans votre cas, vous en avez un (concessionnaire) appartient à plusieurs (utilisateurs)

Dans votre modèle Utilisateurs: 

class Users extends Eloquent {

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

    }

}

Dans l'exemple ci-dessus, Eloquent recherchera une colonne dealership_id dans la table users. Dans votre modèle de concessionnaire: 

class Dealership extends Eloquent {

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

}

Dans votre fonction de magasin: 

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

    }  

En savoir plus ici sur relations éloquentes

Prenez aussi regardez ma réponse ici

6
Paul Bele

En utilisant Push sur le modèle utilisateur, Laravel appelle essentiellement de manière récursive une sauvegarde sur tous les modèles associés (ce qui, dans ce cas, est nul, puisque vous n'y avez encore associé aucun modèle).

Par conséquent, pour accomplir ce que vous essayez de faire, vous pouvez d'abord créer l'utilisateur, puis l'associer au concessionnaire en procédant comme suit:

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

Cependant, avant cela, vous devez vous assurer que les relations entre vos modèles d'utilisateur et de concessionnaire sont correctement configurées:

Modèle d'utilisateur:

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

Modèle de concession:

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

C'est comme ça que je parviens à le faire.

Dans votre contrôleur: (Laravel 5) 

use Auth;

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