1

我有以下迁移:laravel:vaidation VS迁移模式规则

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然后它显示提交时的表单错误。

因此,无论验证规则如何,迁移文件中的哪项工作都令人困惑,甚至在迁移表中提及的都不起作用。

回答

0

这是如何工作的。数据库与PHP分开。通常假设你不真正的大数据工作,你在你的迁移创建例如100个字符列:

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

,并在验证您使用相同的限值以下(如20个字符)。这样,如果您想将限制提高到50个字符,则只能在应用程序中完成,而不触及数据库,但请记住,当您期望获得大量数据时,这不是最佳解决方案 - 在这种情况下,您应该使用最小尺寸你需要。

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

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

0

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

。它不检查字符的数量。

注意括号中的数值参数是以下类型 名称(如:“VARCHAR(255)”)通过的SQLite忽略 - SQLite不 强加任何长度限制(除了大型全球 SQLITE_MAX_LENGTH限制其他)上的字符串长度,BLOB或数字值为 。

这就是为什么没有考虑字符数量。

如果我没有在验证中提到独特的,那么我不能在窗体中显示它。否则它会显示laravel数据库错误。