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 限制的属性,如果它在模型对象的创建中不存在? 这与Nullphp 转换有关吗?

【问题讨论】:

我发现了问题.. 项目是从 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:

在 VARCHAR 的情况下将 null 转换为空字符串 在 bigint 等情况下将 null 转换为 0 通过在config\database.php 文件中将strict 值更改为true .. 它将阻止保存空值.. 它是Laravel >= 5.7 的默认值

【讨论】:

以上是关于Laravel 8.0:将模型中的“非空”字符串属性保存为空字符串的主要内容,如果未能解决你的问题,请参考以下文章

SQLSTATE [23502]:非空违规:7 Laravel API 错误

有没有一种方便的方法来过滤一系列 C# 8.0 可空引用,只保留非空值?

laravel 4将IP地址保存到模型

Laravel S3 文件上传 - PutObject 操作需要非空参数:Bucket

我可以将模型关联到 laravel 中的通知表吗?

Laravel - 如何将下拉表中的数据链接到另一个资源模型