如果我运行以下内容:
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返回,但似乎无法解决为什么这样做
答案 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();