PHP利用Laravel ORM从Mysql读取存储json的字段,有的返回数组,有的返回字符串

PHP利用Laravel ORM从Mysql读取存储json的字段,有的返回数组,有的返回字符串。

public function index(){
        $this->checkPermission('applications/game/index');
        $games = Game::select('id','name','logo','languages','version','pay_configs','advertisement','link','disabled')->get();
        var_dump($games[0]['advertisement']);
        //string(78) "{"zh":"\u751f\u6b7b\2","en":"Battle 2","tr":"Battle 2"}"
        var_dump($games[0]['name']);die();
        //array(3) { ["zh"]=> string(13) "生死" ["en"]=> string(14) "Battle 2" ["tr"]=> string(14) "Battle 2" }
        return $this->success(['games' => $games]);
    }

表结构如下:

CREATE TABLE `games` (
  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(600) NOT NULL COMMENT '游戏名称 {"zh":"生死"}',
  `advertisement` text COMMENT '广告 {"zh":"生死广告"}',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `deleted_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='游戏';

存储在数据库的字段都是字符串的json,为什么一个字段的json取出自动变为数组,另一个字段的json取出还是个字符串?(数据库存储的两个字段内容中文都是unicode转义过的)

阅读 5.7k
2 个回答

原来在model层getNameAttribute()方法里,对从数据库取出的name字段做了处理。

public function getNameAttribute($value){
    if(!is_array($value)) $value = json_decode($value, true);
    return $value;
}

给advertisement这个字段也添加json_decode的处理就行了。
或者可以如一楼所说,在$casts属性中添加advertisement为json的标志即可,无需手写decode处理。

protected $casts = [
    'disabled' => 'integer',
    'advertisement' => 'json',
];
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题