【问题标题】:Laravel Model Create method returns incomplete fields model instanceLaravel Model Create 方法返回不完整的字段模型实例
【发布时间】:2018-11-19 21:45:57
【问题描述】:

我在插入后检索模型数据时遇到问题。下面是一个示例代码,其中 User model 已经有其 $fillable 包含所有需要的属性(idstate 属性作为以下属性的附加)。

$values = ['firstname' => 'Nick', 'lastname' => 'King', 'gender' => 'male' ];
$createdUser = User::create( $values );

这里是迁移代码:

    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('firstname', 60);
        $table->string('lastname', 60);
        $table->string('gender', 6);
        $table->string('state', 20)->default('inactive');
        $table->timestamps();
    });

当将$createdUser 作为JSON 发回时,我注意到state 属性不存在。 它确实存在于迁移中具有默认值,也存在于模型$fillable 中,但不存在于$hidden 属性中。 那怎么了?

这是没有在返回的模型中插入带有默认值的字段的错误,还是这正是 Laravel 的工作方式。

【问题讨论】:

  • 你能分享你的实际模型吗?
  • 啊,看起来像that's how Laravel works。只需使用查询再次访问数据库。例如,想想如果你有一个自动递增的值。只有数据库可以跟踪——Laravel 不能——所以你必须访问数据库两次,一次用于插入,一次用于该列。使用::create,Laravel 只知道你在$values 中明确定义的列。
  • 我认为这通常只是为 API 创建记录时的问题,其中数据返回为JSON。几种方法是 1)在 ::create() 之后再次访问数据库以将 $createdUser 与其对应的数据库同步,或者 2)在您的应用程序中,在您的 create 调用之后将调用链接到 getUser() 之类的东西,所以你正在拉数据库中的用户。
  • $createdUser()->fresh() 将使用数据库中的最新值更新模型。这应该包括状态的默认值。
  • 好吧,再深入一点,你应该能够在你的User 模型上设置一个默认值,包括:protected $attributes = ['state' => 'inactive']; ...这应该给你一个默认值,而不会影响数据库额外的时间。

标签: php laravel laravel-5 eloquent


【解决方案1】:

另一种为模型提供默认值的方法是将$attributes 属性添加到Model 类:

protected $attributes = ['state' => 'inactive'];

这应该在您创建新模型时在 Model 实例上设置默认值,而无需在创建新模型后再次访问数据库以获得默认值。

【讨论】:

    【解决方案2】:

    枚举字段应该有预定义的值:

    $table->enum('state', ['active', 'inactive'])->default('inactive');

    我也会以同样的方式存储性别。

    【讨论】:

    • 问题已被编辑。这是我的错。这里的state 字段是String 类型。谢谢。
    • 我知道,但你应该将它存储为枚举。为什么将其存储为字符串?
    • 事实上,我确实使用了 enum,但只是为了这篇文章,为了简单起见,我选择了这种方式。
    猜你喜欢
    • 1970-01-01
    • 2020-01-30
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    相关资源
    最近更新 更多