我进行了以下迁移:
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 :(得分: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数据库错误。