在Laravel 5中与Eloquent一起流畅地更新现有的一对一关系

时间:2015-11-18 08:31:54

标签: laravel laravel-5 eloquent

我的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();

这非常好,但在我看来并不好看。所以我的问题是:如何清理代码并一次性保存?

3 个答案:

答案 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关系的信息,这肯定有效。