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()