首页 文章

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

提问于
浏览
0

我的数据库中有一个“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 回答

  • 0

    最简单的解决方案是:

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

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

    您的模型应仅反映数据:

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

相关问题