我对opps和laravel都很陌生
因此,要将值插入到我users
和profiles
关系中的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
模型
答案 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
正如阿尔法提到的那样,你也没想到,我认为你需要先保存你的用户模型,然后才能通过关系添加。