创建包含关系的Eloquent对象

时间:2015-06-11 18:23:29

标签: php laravel eloquent laravel-5 foreign-key-relationship

我对opps和laravel都很陌生 因此,要将值插入到我usersprofiles关系中的OneToOne关系,以下是我的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
}

我正在创建新记录,因此dd()永远不会返回与个人资料表相关的任何内容。

这是因为$user对象默认不包括关系吗? 如果是,我可以创建$user对象,其中包含User模型中的关联关系吗?

或者我是否必须为每个表创建两个单独的对象并save()数据<但那么push()方法的意义是什么?

编辑1 附:是的,关系已经在User&amp; Profile模型

4 个答案:

答案 0 :(得分:11)

您可以尝试以下内容。首先保存父模型,如下所示:

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

$user->save();

然后使用以下内容创建并保存相关模型:

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

另请确保您已在profile模型中创建User方法:

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

答案 1 :(得分:5)

我想我会更新这个答案并使其适用于Laravel 5以后。我将以@The Alpha答案为基础。

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

原因是您无法再在save关系(或任何其他关系)上调用belongsTo,现在会返回Illuminate\Database\Query\Builder的实例。

答案 2 :(得分:1)

现在最干净的方法是在用户类文件中:

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

以及您的用户控制器中的以下存储方法:

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);
}

我不知道您是在将纯文本密码保存到您的数据库中还是在密码属性上使用了mutator,无论如何,以上建议是我认为的一种好习惯

答案 3 :(得分:0)

这是因为$ user对象默认不包含关系吗?如果是,我可以创建$ user对象,其中包含用户模型中的关联关系吗?

是的,您应该创建关系,它们不包含在默认中。

在您的User模型中,您需要执行以下操作:

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

这还需要您创建Profile模型。

这肯定会回答您关于插入相关模型的问题:http://laravel.com/docs/5.1/eloquent-relationships#inserting-related-models

正如阿尔法提到的那样,你也没想到,我认为你需要先保存你的用户模型,然后才能通过关系添加。