我的问题是我需要为我的设置json列设置一些值。
让我们说我的用户迁移文件中有此文件:
$table->json('settings');
我的目标是将这些值设置为默认值:
'settings' => json_encode([
'mail' => [
'hasNewsletter' => false
],
'time' => [
'timezone' => ''
]
])
您将如何做?
我的第一种方法是在创建用户后在created
事件中的UserObserver中设置值。
这会产生问题,我的UserFactory无法正常工作。因为创建了用户,但设置值再次被UserObserver覆盖...
答案 0 :(得分:3)
以下解决方案适用于Eloquent模型。
对于默认JSON数据,您可以在模型中执行类似的操作
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $attributes = [
'settings' => '{
"mail": {
"hasNewsletter" : false
},
"time": {
"timezone" : ""
}
}'
];
}
如果输入为空,则数据库中的默认值为{"mail": {"hasNewsletter" : false},"time": {"timezone" :""}
。但是,BD中的现有值将保持不变,并且根据需要手动更改。
如果您想保留现有的数据库值null
(和/或为null),但想通过Eloquent获取上述默认json,则可以在模型中添加以下方法:
protected function castAttribute($key, $value)
{
if ($this->getCastType($key) == 'array' && is_null($value)) {
return '{
"mail":{
"hasNewsletter":false
},
"time":{
"timezone":""
}
}';
}
return parent::castAttribute($key, $value);
}
注意:上面的castAttribute方法将为模型的所有null json列返回相同的json / data。最好在这里设置空数组。
在Laravel 5.8中测试。 参考:https://laravel.com/docs/eloquent#default-attribute-values