laravel:vaidation vs迁移模式规则

时间:2017-07-20 10:17:22

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

我进行了以下迁移:

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,那么它会在提交时显示表单错误。

因此,无论验证规则如何,它都会使迁移文件中的哪些工作感到困惑,甚至在迁移表中都没有提到它。

2 个答案:

答案 0 :(得分:0)

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

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

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

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

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

答案 1 :(得分:0)

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

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

  

请注意类型后面的括号中的数字参数   SQLite忽略了name(例如:“VARCHAR(255)”) - SQLite没有   施加任何长度限制(除了大的全球   SQLITE_MAX_LENGTH limit)对字符串,BLOB或数字的长度   值。

这就是为什么没有计算字符数。

如果我在验证中没有提到唯一,那么我无法在表单中显示它。否则它将显示一个laravel数据库错误。