我的User
模型与另一个UserInformation
模型之间存在一对一的关系,我会在其中存储其他所需的信息,这些信息会导致正常情况下出现问题。用户表。
我设置了这样的模型:
# User.php
public function information()
{
return $this->hasOne(UserInformation::class);
}
# UserInformation.php
public function user()
{
$this->belongsTo(User::class);
}
我有一个个人资料页面,用户可以从这两个表格中更新信息。
视图的输入如下:
<input name="email"> // is a field in the users-table
<input name="information[size]"> // is a field in the users-information table
我在不同的位置读到我应该能够保存我的User
模型及其关系:
$user->fill($request->all())->save();
但是这会引发以下错误:
preg_replace(): Parameter mismatch, pattern is a string while replacement is an array
所以我目前的解决方案如下:
auth()->user()
->fill($request->except('information'))
->save();
auth()->user()
->information
->fill($request->input('information'))
->save();
这非常好,但在我看来并不好看。所以我的问题是:如何清理代码并一次性保存?
答案 0 :(得分:1)
你试过包含这个
吗?protected $guarded = array('information');
在您的User.php
模型文件
然后
auth()->user()
->fill($request->all())
->information->fill($request->input('information'))
->save();
答案 1 :(得分:0)
我认为您当前的解决方案看起来不错,但如果您愿意,您可以随时将其解压缩到您自己的用户模型中的自定义方法。
public function saveWithInformation($attributes)
{
$this->fill($attributes)->save();
$this->information->fill($attributes['information'])->save();
}
然后你可以打电话:
auth()->user()->saveWithInformation($request->all());
答案 2 :(得分:0)
由于我正在寻找一个非常灵活的解决方案,我想出了我在User
模型中实现的这个功能(但它也可以包含在BaseModel
中)
public function fillWithRelation(array $request)
{
foreach ($request as $key => $value)
{
if (is_array($value) && method_exists($this, $key))
// check if the value is an array and if a method with the name of
// the key exists (which would be the relationship
{
$this->{$key}->fill($value);
unset($request[$key]);
}
}
return $this->fill($request);
}
如果您在我的问题中包含hasOne
关系的信息,这肯定有效。