为什么toJSON返回不正确的值

时间:2017-02-23 08:35:54

标签: php laravel eloquent

如果我运行以下内容:

App\User::selectRaw('country as id, COUNT(*) as value')->groupBy('country')->get()

我得到了正确的输出:

all: [ App\User {#705 id: "UK", value: 2,},],}

然而,当我跑

App\User::selectRaw('country as id, COUNT(*) as value')->groupBy('country')->get()->toJSON()

似乎将id值翻转为0:

[{"id":0, "value":2}]

现在有趣的是,如果我转换它以便我不在别名国家字段中获得正确的输出:

[{"country":"UK", "value":2}]

我需要将该字段作为id返回,但似乎无法解决为什么这样做

1 个答案:

答案 0 :(得分:0)

当您在模型上致电toJson()时,如果$incrementing属性为true,Laravel会自动尝试将$primaryKey字段转换为$keyType类型。如果您没有覆盖任何这些值,则意味着{j}生成期间id字段将被转换为int

在您的选择中,您将country字段命名为id,因此在生成json时,它会尝试将此值(UK)转换为int ,当然是0。

您可以将select语句更改为不为字段id命名,或者您可以通过多种不同方式解决此功能,在调用toJson()之前和之后修改模型属性,或者通过覆盖getCasts()方法来完全避免此功能。

修改

在不知道您的代码库或用例的情况下,我会说最灵活的解决方案是为您的App\User模型添加一种新方法,例如:

public function toJsonCustom($options = 0)
{
    $incrementing = $this->getIncrementing();

    $this->setIncrementing(false);

    $json = $this->toJson($options);

    $this->setIncrementing($incrementing);

    return $json;
}

然后,您调用自定义toJson方法而不是原始方法:

App\User::selectRaw('country as id, COUNT(*) as value')
    ->groupBy('country')
    ->get()
    ->toJsonCustom();