设置属性和列外的laravel质量赋值

我的数据库中有一个“full_name”列,但我的数据库中没有“first_name”和“last_name”列 .

这是我的表格:

<form method="POST" action="">
    <input type="text" name="first_name">
    <input type="text" name="last_name">
</form>

这是我的模特:

class User extends Model
{
    protected $guarded = ['first_name', 'last_name'];

    public function setFullNameAttribute()
    {
        $this->attributes['full_name'] = $this->attributes['first_name'].' '.$this->attributes['last_name'];
    }
}

这是我的控制器类中的代码

public function store(StoreUser $request)
{
    $validated = $request->validated();
    $user = Auth::user();
    $user->update($validated);
}

提交表单后,出现错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'first_name' in 'field list'

我知道是什么原因造成的,是因为 $guarded = ['first_name', 'last_name']

但如果我没有守卫那些领域,那就有一个错误:

"Undefined index: first_name"

我知道原因是什么,因为我的数据库中没有“first_name”列 .


所以我卡住了,不知道如何将“full_name”更新到数据库中,并防止分配“first_name”和“last_name”字段 .

PS,我不使用 $user->save() 是因为在现实世界中需要更新质量分配 .

回答(2)

2 years ago

最简单的解决方案是:

class User extends Model
{
    protected $fillable = ['full_name'];

}

存储功能如下所示:

public function store(StoreUser $request)
{
    $validated = $request->validated();
    $validated['full_name'] = $validated['first_name'].' '. $validated['last_name'];
    $user = Auth::user();
    $user->update($validated);
}

2 years ago

控制器角色是使输入适应您的模型/存储库 .

您的模型应仅反映数据:

class User extends Model
{
    protected $guarded = ['full_name'];
}

你的控制器

public function store(StoreUser $request)
{
    $validated = $request->validated();
    $user = Auth::user();
    if (isset($validated['first_name']) && isset($validated['last_name'])) {
        $validated['full_name'] = $validated['first_name'].' '.$validated['last_name'];
    }
    unset($validated['first_name'], $validated['last_name']);
    $user->update($validated);
}

但是如果你想继续使用你的方法,我建议你过度使用更新方法

class User extends Model
{
    protected $guarded = ['first_name', 'last_name'];

    /**
    * @param array $attributes
    * @param array $options
    * @return bool
    */
    public function update(array $attributes = [], array $options = [])
    {
        if (isset($attributes['first_name']) && isset($attributes['last_name'])) {
            $attributes['full_name'] = $attributes['first_name'].' '.$attributes['last_name'];
        }
        unset($attributes['first_name'], $attributes['last_name']);
        return parent::update($attributes, $options);
    }
}