【问题标题】:Laravel type casting for nested array嵌套数组的 Laravel 类型转换
【发布时间】:2019-10-21 07:15:29
【问题描述】:

如何为 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']"
]

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

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

【问题讨论】:

  • @pr1nc3 我将问题编辑得更清楚:如何为允许自动处理嵌套数组编码/解码的 Eloquent 模型创建演员表定义?据我所知,'array' 演员只对数组的第一层进行编码和解码。如果您有嵌套数组,则嵌套级别将仅作为字符串而不是数组返回。

标签: php mysql laravel eloquent casting


【解决方案1】:

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

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

而不是

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-14
    • 2021-10-03
    • 2012-06-03
    • 2017-12-07
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多