我有一个问题,我需要为我的设置 json 列设置一些值。
假设我的用户迁移文件中有这个:
$table->json('settings');
Run Code Online (Sandbox Code Playgroud)
我的目标是将这些值设置为默认值:
'settings' => json_encode([
'mail' => [
'hasNewsletter' => false
],
'time' => [
'timezone' => ''
]
])
Run Code Online (Sandbox Code Playgroud)
你会怎么做?
我的第一种方法是created在用户创建后的事件中设置我的 UserObserver 中的值。
这会产生问题,即我的 UserFactory 无法正常工作。因为创建了一个用户,但设置值再次被 UserObserver 覆盖......
以下解决方案适用于 Eloquent 模型。
对于默认的 JSON 数据,你可以在你的模型中做这样的事情
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $attributes = [
'settings' => '{
"mail": {
"hasNewsletter" : false
},
"time": {
"timezone" : ""
}
}'
];
}
Run Code Online (Sandbox Code Playgroud)
{"mail": {"hasNewsletter" : false},"time": {"timezone" :""}如果您的输入为空,则默认值将在您的数据库中。但是,数据库中的现有值将保持不变,如果需要,必须手动更改。
如果您想保留现有的 DB 值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);
}
Run Code Online (Sandbox Code Playgroud)
注意:上面的 castAttribute 方法将为模型的所有空 json 列返回相同的 json/data。这里最好设置空数组。
在 Laravel 5.8 中测试。参考:https : //laravel.com/docs/eloquent#default-attribute-values
| 归档时间: |
|
| 查看次数: |
6194 次 |
| 最近记录: |