迁移-如何为json设置默认值? (MySQL)

时间:2018-11-26 22:09:40

标签: laravel

我的问题是我需要为我的设置json列设置一些值。

让我们说我的用户迁移文件中有此文件:

$table->json('settings');

我的目标是将这些值设置为默认值:

'settings' => json_encode([
    'mail' => [
        'hasNewsletter' => false
    ],
    'time' => [
        'timezone' => ''
    ]
])

您将如何做?

我的第一种方法是在创建用户后在created事件中的UserObserver中设置值。

这会产生问题,我的UserFactory无法正常工作。因为创建了用户,但设置值再次被UserObserver覆盖...

1 个答案:

答案 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