Laravel 用默认值替换 null

时间:2020-12-22 01:11:07

标签: php laravel validation eloquent

我一直在为一些我认为在 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 中是否有任何东西可以解决这个特定问题?如果没有,还有比我更好的方法吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

有一点我不明白。您希望空字段默认为 0,这样用户就不会将 0 全部放入,但您希望他们有可能放入空字段。他们怎么能让一个字段为空?也许在输入中添加 value="0" 会更容易。