【问题标题】:Access keys in json type column for Eloquent collections?Eloquent 集合的 json 类型列中的访问键?
【发布时间】:2018-02-13 02:32:45
【问题描述】:

我的数据库中的一个表列保存为json 类型。我想在刀片模板上保存的 json 对象中显示一个键控值,但我不确定如何。

假设我的表架构中有$table->json('meta') Newsletter 模型,meta 列具有例如{"foo": "bar"} 作为值。

如何检索$newsletter->meta->foo 之类的内容?由于 $newsletter->meta 在 Laravel 5.5 上默认返回字符串而不是 json 对象,因此需要一个简单的 json_decode 来转换它。

除了json_decode 之外,在每次调用时更简洁的解决方案是在该列上使用访问器,例如getMetaAttribute 但这仍然很乱。我想要 PHP 对象检测自动 json 列,我该如何实现?

【问题讨论】:

    标签: php mysql json laravel-5


    【解决方案1】:

    您可以在模型中声明一个 protected $casts 数组,您可以在其中指示 Eloquent 模型属性的 automatically convert types。在你的情况下,看起来像这样:

    /*
     * @property string $meta - json is actually just a string
     */
    class Newsletter extends Model {
    
        protected $casts = [
            'meta' => 'array',
        ];
    }
    
    // Now you can use `$meta` as array:
    $newsletter = Newsletter::find(1);
    $foo = array_get($newsletter->meta, 'foo');
    

    但这仍然不会将其转换为对象。尽管在文档中提到 object 是一种有效的强制转换类型,但我不能确切地告诉你它的作用。

    请注意,这些$casts 不是双向的。如果您想在 Newsletter 实例上设置 meta,您必须创建自己的工具来将任何对象或数组转换为 json 字符串。 Eloquent 允许您在模型上定义 mutators 以完成工作。

    【讨论】:

    • 谢谢,有什么理由让框架默认将json 列转换为字符串而不是对象?有没有办法覆盖这个?我正在使用几十个模型和各种列,所以我想在全局范围内启用它,而不是单独投射。
    • Eloquent 不会自动分析你的属性值,如果你仔细想想,那会有点奇怪(而且效率很低)。 JSON 数据本身本质上只是 php 的字符串。
    猜你喜欢
    • 1970-01-01
    • 2022-07-22
    • 2019-12-05
    • 2014-04-02
    • 2018-06-26
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多