首页 > 解决方案 > 嵌套数组的 Laravel 类型转换

问题描述

如何为允许自动处理嵌套数组编码/解码的 Eloquent 模型创建强制转换定义?

据我所知,'array'演员只对数组的第一层进行编码和解码。如果您有嵌套数组,则嵌套级别将仅作为字符串而不是数组返回。

Laravel 允许您转换数据类型以用于 Eloquent 模型,以便可以将值传入和传出数据库,而无需连续使用 json_decode 和 json_encode 等。

这是他们的文档讨论类型转换 PHP 数组 <-> MySQL JSON 的地方:

https://laravel.com/docs/master/eloquent-mutators#array-and-json-casting

问题是如果你有一个嵌套的 PHP 数组并且你想将它转换到 MySQL 或者从 MySQL 转换,Laravel 的数组转换只在第一级有效。

具有多个嵌套级别的数组或对象将其嵌套级别存储和检索为字符串而不是数组。

例如:

如果这是您模型中的属性:

protected $casts = [
    'nestedArray' => 'array'
]

然后您尝试将此嵌套数组存储到您的数据库中:

$nestedArray = [
    'sample1key' => 'sample1data',
    'sample2key' => ['nested2key' => 'nested2data']
]

如果您使用上面的 PHP 数组并将其作为 JSON 存储在 MySQL DB 中,然后检索它,而不是原来的嵌套数组,您将得到以下结果:

$nestedArray = [
    'sample1key' => 'sample1data',
    'sample2key' => "['nested2key' => 'nested2data']"
]

请注意新的双引号,这意味着它是一个字符串,然后您必须使用 json_decode onsample2key以编程方式访问其元素,这不太理想。

这个例子看起来很简单,但在规模上不方便。我正在尝试找到一种方法来创建一个对数组的所有嵌套级别进行编码/解码的强制转换 - 而不仅仅是第一级。

标签: phpmysqllaraveleloquentcasting

解决方案


原来我的问题在于我正在使用

$tableResults = DB::table('table')->where()....

代替

$tableResults = new Table();
$tableResults = $tableResults->where()....

出于显而易见的原因,Eloquent 类型转换仅在您实际使用 Eloquent 模型时才有效。当您直接与数据库交互时,它没有任何相关性。


推荐阅读