Laravel 8.0:将模型中的“非空”字符串属性保存为空字符串
Posted
技术标签:
【中文标题】Laravel 8.0:将模型中的“非空”字符串属性保存为空字符串【英文标题】:Laravel 8.0: Saving "Not Null" String attribute in a Model as an Empty String 【发布时间】:2021-10-18 12:47:59 【问题描述】:我创建了一个名为“WalletAddress”的新模型,它具有以下迁移文件:
Schema::create('wallet_addresses', function (Blueprint $table)
$table->bigIncrements('id');
$table->bigInteger('user_id')->comment('User Owner of address');
$table->string('alias')->comment('alias name for the address');
$table->string('type')->comment('Address type');
$table->string('address')->comment('Wallet Address');
$table->enum('status',[
'Confirmed',
'Pending',
'Deleted',
]);
$table->json('address_properties')->nullable();
$table->timestamps();
$table->softDeletes();
);
Model类定义如下:
class WalletAddress extends Model
use SoftDeletes;
protected $guarded = [];
protected $dates = [
'address_properties->confirmation_Validity_deadline',
];
protected $casts = [
'address_properties' => 'json',
];
public function addressOwner()
return $this->belongsTo(User::class, 'user_id', 'id');
我尝试使用以下代码创建并保存模型的新实例:
$walletAddress = new WalletAddress([
'status' => 'Pending'
]);
$walletAddress->save();
我将结果作为新记录保存在数据库中,其中所有“非空”VARCHAR 字段(如“别名、类型、地址”)保存为空字符串,而 bigint 字段(如 user_id)保存为 0。
我正在使用升级后的 Laravel 8.x 和 mysql 8.0 数据库
为什么 Laravel 不阻止保存带有 Not Null
限制的属性,如果它在模型对象的创建中不存在?
这与Null
的 php 转换有关吗?
【问题讨论】:
我发现了问题.. 项目是从 Laravel 5.6 更新的,它将config/database.php
文件中的参数strict
设置为false
.. 这将允许保存@987654329 @ 值到 MySQL 中的等效类型:在 VARCHAR 的情况下将 null 转换为空字符串 在 bigint 的情况下将 null 转换为 0 等等。通过将 config\database.php
文件中的 strict
值更改为 true
..它将阻止保存空值..
【参考方案1】:
我发现了问题 .. 它表明项目是从 Laravel 5.6 更新的,它将 config/database.php
文件中的参数 strict
设置为 false
.. 这将允许将空值保存为等效类型MySQL:
config\database.php
文件中将strict
值更改为true
.. 它将阻止保存空值.. 它是Laravel >= 5.7 的默认值
【讨论】:
以上是关于Laravel 8.0:将模型中的“非空”字符串属性保存为空字符串的主要内容,如果未能解决你的问题,请参考以下文章
SQLSTATE [23502]:非空违规:7 Laravel API 错误
有没有一种方便的方法来过滤一系列 C# 8.0 可空引用,只保留非空值?