【发布时间】:2018-11-19 21:45:57
【问题描述】:
我在插入后检索模型数据时遇到问题。下面是一个示例代码,其中 User model 已经有其 $fillable 包含所有需要的属性(id 和 state 属性作为以下属性的附加)。
$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