【问题标题】:Laravel eloquent JSON field, selecting attribute produce extra double quoteLaravel 雄辩的 JSON 字段,选择属性产生额外的双引号
【发布时间】: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?

标签: json laravel eloquent


【解决方案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')... 这行不通
猜你喜欢
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 2021-05-12
相关资源
最近更新 更多