php - 嵌套数组的 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
以编程方式访问其元素,这不太理想。
这个例子看起来很简单,但在规模上不方便。我正在尝试找到一种方法来创建一个对数组的所有嵌套级别进行编码/解码的强制转换 - 而不仅仅是第一级。
解决方案
原来我的问题在于我正在使用
$tableResults = DB::table('table')->where()....
代替
$tableResults = new Table();
$tableResults = $tableResults->where()....
出于显而易见的原因,Eloquent 类型转换仅在您实际使用 Eloquent 模型时才有效。当您直接与数据库交互时,它没有任何相关性。
推荐阅读
- angular - 如何使用 cdkDrag 获取 drop 后的位置?
- javascript - 使用下拉列表在 HTML 表格中进行更改
- visual-studio-code - Git History 扩展在 VS Code 中不起作用
- android - Android 发布 APK 不使用 Retrofit2 从带有 SSL 的 Web 服务解析 JSON
- javascript - TypeError:无法读取 reactjs 组件中未定义的属性“setState”
- reactjs - 为什么类型在枚举中没有重叠?
- java - 使用 java 在 rhino 中调用 chartjs
- django - Creating functional classes in Django that provide deployment pipeline functionality
- rest - Can I invent my own HTTP Status Code for when an entity is updated and the server returns a representation of the updated entity?
- c# - 匹配数组
SqlParser.Parser 的输出?