次を実行した場合:
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 として返す必要がありますが、なぜこれを行うのか理解できないようです
toJson()
モデルを呼び出すときに、$incrementing
プロパティがの場合true
、Laravelは自動的に$primaryKey
フィールドを$keyType
タイプにキャストしようとします。これらの値のいずれもオーバーライドしていない場合は、jsonの生成中に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 メソッドの代わりにカスタムの toJson メソッドを呼び出します。
App\User::selectRaw('country as id, COUNT(*) as value')
->groupBy('country')
->get()
->toJsonCustom();
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加