【问题标题】:laravel: vaidation vs migration schema ruleslaravel:验证与迁移模式规则
【发布时间】:2017-12-25 23:38:03
【问题描述】:

我有以下迁移:

Schema::create('ingredients', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name',10)->unique()->nullable(false);
    $table->timestamps();
});

如果你注意到我希望字符串不超过 10 个字符

在我的控制器中,我有:

$this->validate($request, [
    'name' => 'bail|required|unique:ingredients|max:200',
]);

在控制器中我提到最大字符数为 200。

所以当我用超过 10 个字符和少于 200 个字符填写表格时,它会存储在数据库中。这怎么可能。

laravel 不会检查迁移文件架构规则和验证规则之间的完整性。

我还注意到的另一件事是:如果我从控制器中删除验证规则并提交表单,它仍然不会检查 w.r.t 10 的字符数。它会创建一个新的数据库记录。即使我不使用任何验证规则,它也会检查唯一记录。

无论验证规则中是否提及,都会检查为什么要检查唯一性。

迁移文件中字符的最大数量(10)也没有意义。因为无论有没有验证规则,我都可以输入超过 10 个字符的名称。

好像我的验证规则说 max:2 然后它在提交时显示表单错误。

因此,无论验证规则如何,哪些可以从迁移文件中工作,而哪些甚至在迁移表中提到也根本不起作用。

【问题讨论】:

    标签: laravel laravel-5 laravel-5.4 laravel-validation laravel-migrations


    【解决方案1】:

    这就是它的工作原理。数据库与 PHP 是分开的。通常假设您不使用真正的大数据,例如在迁移中创建 100 个字符的列:

    $table->string('name',100)->unique()->nullable(false);
    

    在您的验证中,您使用相同或更少的限制(例如 20 个字符)。这样,如果您想将限制提高到 50 个字符,您只能在应用程序中执行此操作而不接触数据库,但请记住,当您期望大量数据时,这不是最佳解决方案 - 在这种情况下,您应该使用最小的大小你需要。

    Laravel 不会为您检查数据库中的列最大大小。您可以尝试为自己添加这样的助手,但这样做可能没有多大意义。

    当您开发应用程序时,您必须知道发生了什么。例如,Laravel 也不会神奇地验证表中是否有列。需要在migration中添加,如果不添加,尝试插入数据时会出现异常。

    【讨论】:

      【解决方案2】:

      我有两个条件string('name',10)max:200

      我正在使用 sqlite。它不检查字符数。

      注意类型后面括号中的数字参数 名称(例如:“VARCHAR(255)”)被 SQLite 忽略 - SQLite 不会 施加任何长度限制(除了大的全局 SQLITE_MAX_LENGTH 限制)字符串、BLOB 或数字的长度 价值观。

      这就是为什么不计算字符数的原因。

      如果我在验证中没有提到唯一性,那么我就不能在表单中显示它。否则会显示 laravel 数据库错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-26
        • 2016-12-17
        • 2020-06-25
        • 2020-06-09
        • 2021-12-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多