Laravel 雄辩的 JSON 字段,选择属性产生额外的双引号
Posted
技术标签:
【中文标题】Laravel 雄辩的 JSON 字段,选择属性产生额外的双引号【英文标题】:Laravel eloquent JSON field, selecting attribute produce extra double quote 【发布时间】:2018-05-16 22:26:23 【问题描述】:这段代码:
$translation = Translation::where('language_id', 2)
->whereNotNull('data->navigation_login')
->select('data->navigation_login as navigation_login')
->first()
->toArray();
dd($translation);
产生这个结果:
array(1) ["navigation_login"]=> string(7) ""Login""
问题是登录字符串周围有多余的双引号:""Login""
我怎样才能消除这种情况?
如果我在没有选择的情况下运行 aboe 代码:
$translation = Translation::where('language_id', 2)
->whereNotNull('data->navigation_login')
->first()
->toArray();
dd($translation);
没有双引号:
["data"]=>
array(3)
["navigation_login"]=>
string(5) "Login"
["navigation_order"]=>
string(5) "Order"
["navigation_registration"]=>
string(7) "Sign up"
这是模型细节:
...
class Translation extends Model
protected $casts = [
'data' => 'array',
];
...
这是架构详细信息:
...
$table->json('data')->nullable();
...
【问题讨论】:
你能在data->navigation_login这一行放点代替->吗? 翻译模型的表真的叫“数据”吗?您能否提供一些有关表架构的信息? @DrStein->select('data.navigation_login as navigation_login')
点不起作用。 未知列“data.navigation_login”
@MartinJoiner 我更新了问题。
可能是 laravel 的 bug?
【参考方案1】:
终于解决了:
MySQL 5.7.13 及更高版本
Using the unquoting extraction operator->>
->select('data->>navigation_login as navigation_login')
或旧的mysql版本5.7 ->select(\DB::raw("JSON_UNQUOTE(JSON_EXTRACT(data, '$.navigation_login')) as navigation_login"))
【讨论】:
那么对于 json 类型的数组又会如何呢? '["a", "b", "c"]' ->select('data->>[1] as data')... 这行不通以上是关于Laravel 雄辩的 JSON 字段,选择属性产生额外的双引号的主要内容,如果未能解决你的问题,请参考以下文章