插入相关模型:"Field doesn't have a default value"
Insert related models: "Field doesn't have a default value"
character
字段由表单填写(dd() 证明),但出现此错误:
一般错误:
1364 Field 'character' doesn't have a default value (SQL: insert into `characters` (`name`, `user_id`, `updated_at`, `created_at`)
保存还是创建?
我尝试保存另一个与用户相关的模型。有表单数据和内部数据。这就是为什么我不能只使用 create-method 的原因,对吗?没有人应该能够操纵其中的一些值。
public function store()
{
// validation
$character = new Character([
'user_id' => auth()->id(),
'character' => request('character'),
'name' => request('name'),
'level' => 1,
'experience' => 0,
'health' => 500,
'primary' => 'test',
'secondary' => 'test',
]);
$user = auth()->user();
$user->characters()->save($character);
// redirect
}
我的两个主要问题:
- 为什么这会引发指向
character
的 SQL 错误?
- 这是一种很好的节省方法,还是我应该让所有内容都可填充并使用 create?
可能 request('character')
returns null
。因此,您需要创建此列 ->nullable()
或使用 ->default('a')
.
之类的内容为其添加默认值
最好尽可能使用 create()
和类似的方法。
$fillable
属性 不仅影响 create()
方法,它影响任何使用 fill()
方法的东西。当您通过构造函数将属性传递给新实例时,这也会在幕后使用 fill()
方法。因此,所有这些值也会受到 $fillable
属性 的影响。因此,如果 character
不在 $fillable
数组中,您显示的代码将抛出错误。
很难说 "good" 方法是什么,因为所有方法在安全性和可用性方面都有不同的权衡。如果你的模型是完全没有保护的,那使得代码容易编写,但更容易引入安全问题。如果您的模型完全受保护,则代码必须更加冗长,但不太容易出现安全问题。这完全取决于您对什么感到满意。
重要的是了解框架的工作原理,这样您就可以了解这些权衡取舍并确定什么 "good" 适合您和您的应用程序。
就个人而言,除非情况另有规定,否则我倾向于让所有字段都可填写,除了主键和外键。保护可填写字段的责任落在处理输入的地方(例如控制器操作)。
public function store()
{
// validation
// make sure to only accept "character" and "name" input from the user.
// all other fields are defaulted.
// note: foreign key user_id has been removed
// note: all these fields must be fillable or else they will be skipped
$data = array_merge(
$request->only(['character', 'name']),
[
'level' => 1,
'experience' => 0,
'health' => 500,
'primary' => 'test',
'secondary' => 'test',
]
);
// create a new instance with the given data; does not touch the db yet.
$character = new Character($data);
$user = auth()->user();
// assigns the foreign key field then saves record to the database.
$user->characters()->save($character);
// redirect
}
character
字段由表单填写(dd() 证明),但出现此错误:
一般错误:
1364 Field 'character' doesn't have a default value (SQL: insert into `characters` (`name`, `user_id`, `updated_at`, `created_at`)
保存还是创建?
我尝试保存另一个与用户相关的模型。有表单数据和内部数据。这就是为什么我不能只使用 create-method 的原因,对吗?没有人应该能够操纵其中的一些值。
public function store()
{
// validation
$character = new Character([
'user_id' => auth()->id(),
'character' => request('character'),
'name' => request('name'),
'level' => 1,
'experience' => 0,
'health' => 500,
'primary' => 'test',
'secondary' => 'test',
]);
$user = auth()->user();
$user->characters()->save($character);
// redirect
}
我的两个主要问题:
- 为什么这会引发指向
character
的 SQL 错误? - 这是一种很好的节省方法,还是我应该让所有内容都可填充并使用 create?
可能 request('character')
returns null
。因此,您需要创建此列 ->nullable()
或使用 ->default('a')
.
最好尽可能使用 create()
和类似的方法。
$fillable
属性 不仅影响 create()
方法,它影响任何使用 fill()
方法的东西。当您通过构造函数将属性传递给新实例时,这也会在幕后使用 fill()
方法。因此,所有这些值也会受到 $fillable
属性 的影响。因此,如果 character
不在 $fillable
数组中,您显示的代码将抛出错误。
很难说 "good" 方法是什么,因为所有方法在安全性和可用性方面都有不同的权衡。如果你的模型是完全没有保护的,那使得代码容易编写,但更容易引入安全问题。如果您的模型完全受保护,则代码必须更加冗长,但不太容易出现安全问题。这完全取决于您对什么感到满意。
重要的是了解框架的工作原理,这样您就可以了解这些权衡取舍并确定什么 "good" 适合您和您的应用程序。
就个人而言,除非情况另有规定,否则我倾向于让所有字段都可填写,除了主键和外键。保护可填写字段的责任落在处理输入的地方(例如控制器操作)。
public function store()
{
// validation
// make sure to only accept "character" and "name" input from the user.
// all other fields are defaulted.
// note: foreign key user_id has been removed
// note: all these fields must be fillable or else they will be skipped
$data = array_merge(
$request->only(['character', 'name']),
[
'level' => 1,
'experience' => 0,
'health' => 500,
'primary' => 'test',
'secondary' => 'test',
]
);
// create a new instance with the given data; does not touch the db yet.
$character = new Character($data);
$user = auth()->user();
// assigns the foreign key field then saves record to the database.
$user->characters()->save($character);
// redirect
}