Laravel 集合属性和列之外的LAVEL质量指定

Laravel 集合属性和列之外的LAVEL质量指定,laravel,eloquent,Laravel,Eloquent,我的数据库中有一个“全名”列,但我的数据库中没有“名字”和“姓氏”列 这是我的表格: <form method="POST" action=""> <input type="text" name="first_name"> <input type="text" name="last_name"> </form> 这是我的控制器类中的代码 public function store(StoreUser $request) {

我的数据库中有一个“全名”列,但我的数据库中没有“名字”和“姓氏”列

这是我的表格:

<form method="POST" action="">
    <input type="text" name="first_name">
    <input type="text" name="last_name">
</form>
这是我的控制器类中的代码

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'
"Undefined index: first_name"
我知道这是什么原因,因为
$guarded=['first\u name','last\u name']

但如果我没有保护这些字段,就会出现错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'first_name' in 'field list'
"Undefined index: first_name"
我知道这是什么原因,因为我的数据库中没有“first_name”列


所以我陷入困境,不知道如何将“全名”更新到数据库中, 并防止分配“名字”和“姓氏”字段


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

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

您的模型应仅反映数据表:

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

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

您的模型应仅反映数据表:

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

最简单的解决方案是:

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

最简单的解决方案是:

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

谢谢,它可以工作,但是如果将来需要更改,这意味着我必须在每个类上修改它:(
protected$guarded=['first\u name','last\u name'];
在您的示例中没有任何作用。谢谢,它可以工作,但是如果将来需要更改,这意味着我必须在每个类上修改它:(
protected$guarded=['first\u name','last\u name'];
在您的示例中没有任何作用。覆盖更新方法的想法很好,这意味着我可以在任何地方使用它,只要有“first_name”和“last_name”,模型将自动生成“full_name”并插入数据库!@Autodesk考虑
$guarded=[“first_name”,“last_name”];
$filleble=['full_name'];
不是一回事。更新了答案,但您应该真正使用第一个解决方案。否则,您的代码中会出现很多异常。@Autodesk您知道$guarded不会阻止您像现在这样分配
全名
属性。它只会阻止批量分配。例如
User::create(['full\u name'=>'hi there'])
新用户(['full\u name'=>'hi there'])
。因此可以像使用
save()
方法$guarded仅对批量分配有效一样保存它,
update()
是批量分配,因此
update()
不会更新那些$guarded字段,而是
save()
将更新$guarded字段,因为
save()
不是批量分配。我正确吗?完全正确,您忘记使用的是
update()
而不是
save())
覆盖更新方法的想法很好,这意味着我可以在任何地方使用它,只要有“first_name”和“last_name”,模型就会自动生成“full_name”并插入数据库!@Autodesk考虑
$guarded=['first_name',last_name'];
$filleble=['full_name'];
不是一回事。更新了答案,但您应该真正使用第一个解决方案。否则,您的代码中会出现很多异常。@Autodesk您知道$guarded不会阻止您像现在这样分配
全名
属性。它只会阻止批量分配。例如
User::create(['full\u name'=>'hi there'])
新用户(['full\u name'=>'hi there'])
。因此可以像使用
save()
方法$guarded仅对批量分配有效一样保存它,
update()
是批量分配,因此
update()
不会更新那些$guarded字段,而是
save()
将更新$guarded字段,因为
save()
不是批量分配。我正确吗?完全正确,您忘记使用
update()
而不是
save()