Laravel模型使用 cast array入库json时,防止中文转义Unicode

问题描述

class UserModel extends Model
{
    protected $table = 'user';

    protected $casts = [
        'alias'      => 'array'
    ];
}

直接存 alias 字段,数据库会显示 Unicode 码

["\u7f51\u7ad9\u57df\u540d"]

问题解决

方式一:自定义属性
class UserModel extends Model
{

    public function setAliasAttribute($option)
    {
        $this->attributes['alias'] = json_encode($option, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    }
}
方式二:继承覆写
class UserModel extends Model
{
    protected $table = 'user';

    protected $casts = [
        'alias'      => 'array'
    ];

    // 覆盖asJson方法
    protected function asJson($value)
    {
        return json_encode($value, JSON_UNESCAPED_UNICODE);
    }
}
方式三:trait复用
<?php

namespace App\Traits;

trait UnicodeJsonTrait
{
    /**
     * 序列化json
     * @param $value
     * @return false|string
     */
    protected function asJson($value)
    {
        return json_encode($value, JSON_UNESCAPED_UNICODE);
    }
}
  • Model里使用Trait
use App\Traits\UnicodeJsonTrait;

class UserModel extends Model
{
    //使用Trait
    use UnicodeJsonTrait;

    protected $table = 'user';

    protected $casts = [
        'alias'      => 'array'
    ];
}
方式四:自定义转换器Cast子类
class UserModel extends Model
{
    protected $table = 'user';

    protected $casts = [  //使用自定义转换器类
        'alias'      =>  JsonWithoutUnicode::class,
    ];
}
  • 自定义转换器类
<?php
namespace App\Casts;

use Illuminate\Contracts\Database\Eloquent\CastsAttributes;

// 自定义转换器类
class JsonWithoutUnicode implements CastsAttributes
{
    public function get($model, string $key, $value, array $attributes)
    {
        return json_decode($value, true);
    }
 
    public function set($model, string $key, $value, array $attributes)
    {
        // 直接将值转为JSON字符串,不进行Unicode转义
        return json_encode($value, JSON_UNESCAPED_UNICODE);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容