web-dev-qa-db-fra.com

Création d'un objet éloquent avec relation incluse

Je suis à peu près nouveau dans les domaines opps et laravel Donc, pour insérer les valeurs dans ma table users et profiles qui ont une relation OneToOne, voici à quoi ressemble ma méthode store()

public function store(Requests\StoreNewUser $request)
{
    // crate an objct of user model
        $user = new \App\User;
        // now request and assign validated input to array of column names in user table
        $user->first_name = $request->input('first_name');
        $user->last_name = $request->input('last_name');
        $user->email = $request->input('email');
        $user->password = $request->input('password');
        /* want to assign request input to profile table's columns in one go 
        */
        $user->profile()->user_id = $user->id; // foreign key in profiles table
        $user->profile()->mobile_no = $request->input('mobile'); 
        dd($user); // nothing related to profile is returned
}

Je crée le nouvel enregistrement. Par conséquent, dd() ne renvoie jamais rien qui soit lié à la table de profil.

Est-ce parce que l'objet $user n'inclut pas de relation par défaut? Si oui, est-ce que je peux créer l'objet $user qui inclut les relations associées dans le modèle User

Ou dois-je créer deux objets distincts de chaque table et save() les données
Mais alors quelle est la signification de la méthode Push()

EDIT 1 P.S. oui, les relations sont déjà définies dans le modèle User & Profile 

8
echoashu

Vous pouvez essayer quelque chose comme ce qui suit. Commencez par enregistrer le modèle parent comme ceci:

$user = new \App\User;
$user->first_name = $request->input('first_name');
// ...

$user->save();

Ensuite, créez et enregistrez le modèle associé en utilisant quelque chose comme ceci:

$profile = new \App\Profile(['mobile_no' => $request->input('mobile')]);
$user->profile()->save($profile);

Assurez-vous également que vous avez créé la méthode profile dans le modèle User:

public function profile()
{
    return $this->hasOne('App\Profile');
}
11
The Alpha

Je pensais mettre à jour cette réponse et la rendre applicable à partir de Laravel 5. Je vais utiliser @ The Alpha answer comme base.

$profile = new \App\Profile(['mobile_no' => $request->input('mobile')]);
$user->profile()->associate($profile); // You can no longer call 'save' here
$user->profile()->save();

La raison en est que vous ne pouvez plus appeler save sur la relation belongsTo (ou toute autre relation), cela retourne maintenant une instance de Illuminate\Database\Query\Builder.

3
Matt

Est-ce parce que l'objet $ user n'inclut pas de relation par défaut? Si oui, est-ce que je peux créer l'objet $ user qui inclut les relations associées dans le modèle d'utilisateur?

Oui, vous devriez créer la relation, ils ne sont pas inclus par default .

Dans votre modèle User, vous voudriez faire quelque chose comme ceci:

public function profile()
{
    return $this->hasOne('App\Profile'); // or whatever your namespace is
}

Cela nécessiterait également la création d'un modèle Profile.

Cela répondrait certainement à vos questions concernant l’insertion de modèles associés: http://laravel.com/docs/5.1/eloquent-relationships#inserting-related-models

Comme The Alpha l'a mentionné, et vous avez également éludé, je pense que vous devez d'abord enregistrer votre modèle utilisateur pour pouvoir ensuite ajouter via une relation.

0
haakym

La façon propre de le faire maintenant serait d’avoir sur votre fichier de classe d’utilisateur:

public function profile()
{
    return $this->hasOne(App\Profile::class);
}

et dans votre contrôleur utilisateur, la méthode de stockage suivante:

public function store(Requests\StoreNewUser $request)
{
    $user = App\User::create(
        $request->only(
            [
                'first_name',
                'last_name',
                'email'
            ]
        )
    );

    $user->password = Illuminate\Support\Facades\Hash::make($request->password);
    //or $user->password = bcrypt($request->password);

    $user->profile()->create(
        [
            'mobile_no' =>  $request->mobile;
        ]
    );

    dd($user);
}

Je ne savais pas si vous sauvegardiez le mot de passe en texte brut dans votre base de données ou si vous utilisiez un attribut mutator on password, quoi qu'il en soit suggéré ci-dessus est une bonne pratique, je pense

0
diegochaves