Php Laravel在不可为空的字段中插入0且没有默认值
我只有一个项目有这个奇怪的问题。 目前可以执行此代码,Laravel转换为以下SQL:Php Laravel在不可为空的字段中插入0且没有默认值,php,laravel,Php,Laravel,我只有一个项目有这个奇怪的问题。 目前可以执行此代码,Laravel转换为以下SQL: $elTicket = documentos_venta::create([ ]); SQL: 结果: SQL语句结果 表: 问题是它不考虑数据库表中不可为空的字段 它会自动用0填充不可为null的整数,用null填充varchar。 在项目中插入模型时发生 忘了提到在mariaDB中执行sql语句会像预期的那样失败我发现了问题。 在config/database.php内部 M
$elTicket = documentos_venta::create([
]);
SQL:
结果:
SQL语句结果
表:
问题是它不考虑数据库表中不可为空的字段
它会自动用0填充不可为null的整数,用null填充varchar。
在项目中插入模型时发生
忘了提到在mariaDB中执行sql语句会像预期的那样失败我发现了问题。
在config/database.php内部
MYSQL连接的配置不正确
不正确:
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => false,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
严格值为false,必须为true。
我不知道为什么设置为false,这很奇怪。它应该抛出一个NOTNULL约束冲突sql错误。您确定它会转换为sql查询吗?如果这些字段为空,可能会有一个变量覆盖它们。尝试在您的
AppServiceProvider
的boot()
方法中添加以下内容:\DB::listen(函数($query){debug([$query->sql,$query->bindings,$query->time])代码>。然后进行查询并检查您的laravel日志。是的,这是非常罕见的。尝试一个新项目,效果很好。我不知道这是怎么回事。是的,这样我就得到了生成的sqlCheckdocumentos\u venta
模型。是否有一个名为setsucursaltribute($value)
?的函数,或者可能是定义了创建
、更新
或保存
事件侦听器的函数?@IGP否,模型是正确的。同样的问题是在项目的任何模型中尝试\DB::listen
之类的东西。它将显示针对您的数据库运行的绑定的确切查询。默认情况下,它将设置为false,以与绝大多数现有MySQL安装兼容(尽管严格的在任何情况下都更好)。您最近是否升级或更改了正在使用的数据库?我刚刚检查了其他项目,严格的值为true。这个项目是在Laravel7中开发的,它从PHP7.x开始,不久前它更新为PHP8.0,但它仍然在Laravel7中。编辑:更改另一个项目中的strict值,如果该值设置为false,则会有效解决此问题occurs@Jason我忘了在MYSQL文档中标记您:如果未启用严格模式,MYSQL将列设置为列数据类型的隐式默认值,对于数值类型,默认值为0@Jason是的,那是个错误。我找不到它,因为我不知道它被设置为false。
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => false,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],