我一直在为一些我认为在 Laravel 中是一项非常简单的任务而苦苦挣扎。
基本上,我有一个包含多个带有默认值的列的表,以允许用户将某些字段留空,而不必到处写“0”。这是我的迁移查找参考的方式:
public function up()
{
Schema::create('clients', function (Blueprint $table) {
$table->id()->autoIncrement();
$table->string('first_name')->nullable();
$table->string('last_name')->nullable();
$table->date('arrival_date');
$table->date('departure_date');
$table->smallInteger('sector')->nullable();
$table->smallInteger('adults')->default('0');
$table->smallInteger('children')->default('0');
$table->smallInteger('electricity')->default('0');
$table->smallInteger('small_places')->default('0');
$table->smallInteger('big_places')->default('0');
$table->smallInteger('discount')->default('0');
$table->timestamps();
});
}
问题是 - 我似乎找不到使用默认值的方法 - 发送带有空字段的表单会将它们作为“空”值,这些值仍然被视为值,因此尝试创建模型最终关于空值的错误。 DB 中的默认值和默认模型值都不起作用 - 因为这些值中的每一个都会被覆盖。参考模型默认值:
protected $attributes = [
'adults' => 0,
'children' => 0,
'electricity' => 0,
'small_places' => 0,
'big_places' => 0,
'discount' => 0
];
到目前为止,我找到了一些解决方案,但没有一个是正确的,我觉得我错过了一些东西。
所以,我目前的解决方案是这样的:
public static function add(Request $request)
{
if (!self::validateRequest($request)) return; // Just checks if required fields are OK, doesn't change values
Client::create(array_filter($request->all(), function ($item) {
return !empty($item);
}));
}
基本上,我只是从 $request 中删除所有“空”值,因此使用数据库中的默认值。这个解决方案的缺点是,当我实际上想要分配一个空值时 - 它会被删除。
我发现的第二个解决方案效果很好,但增加了大量代码,并且必须专门为任何模型制作。我可以在我的模型中创建一个中间件/只是一个函数,它有一个可为空的键和默认值的列表,如果一个键为空且不可为空,它将用默认值替换它。 这个解决方案的问题是......我基本上是在编写数据库中已经存在的规则,但又一次。这将使我的数据库中的可空值和默认值变得多余,因为我已经在代码中完成了所有工作...
那么 - 有没有办法,例如,使用已经编写好的 Migration 作为模板进行验证或类似的东西,或者 Laravel 中是否有任何东西可以解决这个特定问题?如果没有,还有比我更好的方法吗?
提前致谢!
答案 0 :(得分:0)
有一点我不明白。您希望空字段默认为 0,这样用户就不会将 0 全部放入,但您希望他们有可能放入空字段。他们怎么能让一个字段为空?也许在输入中添加 value="0"
会更容易。