首页 > 解决方案 > Eloquent 中的查询在不应该的情况下工作 - 在 MySQL 中,它按预期失败

问题描述

如果你在 MySQL 中设置了一个整数字段,不允许空值,默认为空,并且你编写了一个省略该字段的查询,在 Laravel 中查询仍然执行,并且不使用默认值 null,而是写为 ' 0'。

如果我采用 Eloquent/query builder 生成的准确查询,并在 MySQL 中运行它,它会失败,正确地说明相关字段必须具有默认值。

为什么会出现这种差异?eloquent/query builder/pdo 到底在做什么?!

创建表语法如下:

CREATE TABLE `chapters` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`account_id` int(10) unsigned NOT NULL,
`season_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `chapters_account_id_index` (`account_id`),
KEY `chapters_season_id_index` (`season_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6060 DEFAULT CHARSET=utf8 
COLLATE=utf8_unicode_ci

在 MySQL 中执行插入和省略 account_id 失败 - 应该如此。尽管生成的查询是正确的,但在 Eloquent/Laravel 中做同样的事情并没有。

标签: mysqlsqllaraveleloquent

解决方案


所以我弄清楚发生了什么。Laravel 默认在 config/database.php 中将严格的规则设置为 false。这将关闭所有关于严格模式的选项,例如完整分组、严格的反表等。

我们所做的是在 my.cnf 上设置 STRICT_ALL_TABLES,然后将 laravel 强制为 strict = true。这解决了它。


推荐阅读