ホームページ > 記事 > PHPフレームワーク > Laravel が長整数のスノーフレーク ID を文字列に自動的に変換する方法を説明します
次のチュートリアルコラムでは、Laravel が長整数のスノーフレーク ID を文字列に自動的に変換する方法を紹介します。困っている友達を助けましょう! API を設計する場合、セキュリティなどの理由から、自動インクリメント ID の使用を放棄して、ID を非連続で推測不可能にする必要がある場合があります。これは通常、ハッシュ ID、UUID、Snowflake ID などを使用して実現できます。 最近のプロジェクトで、Snowflake ID を使用してみました。いろいろいじってみた結果、パフォーマンスは非常に高く、実装は非常に簡単であることがわかりました。しかし、続けてフロントエンド部分に接続すると、保存されている ID が符号なしの bigint 値であるため、JS の精度が失われるという問題が発生しました。 (なぜ精度が落ちるのかについては、ここでは詳しく説明しません。わからない場合はご自身で調べてください。) この記事では主に解決策を紹介します。
この問題を解決するための基本原理は非常に単純です。つまり、ID を文字列に変換してフロントエンドに返すというものです。
悪い試み
/** * @return string */public function getIdAttribute(){ return strval($this->attributes['id']);}
ただし、これは当てはまりません。属性アクセサーは、API によってフロントエンドに返される ID を実際に作成できます。弦。ただし、関連付けられたモデルの挿入と変更の結果にも影響します。たとえば、ユーザーが投稿モデルに関連付けられている場合、$user->posts()->saveMany(…); を使用して新しい投稿レコードを保存します。対応する user_id は空になります。
モデル アクセサーはモデル関連の処理に参加する必要があるため、これを理解するのは難しくありません。アクセサーは ID を数値から文字列に変換するため、当然データの混乱が生じます。
正しい姿勢
<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; class Resource extends JsonResource { /** * Transform the resource into an array. * * @param \Illuminate\Http\Request $request * * @return array */ public function toArray($request) { $parentReturn = parent::toArray($request); foreach (array_keys($parentReturn) as $key) { // 为方便演示这里把所有整型字段都转成字符串 if (is_int($parentReturn[$key])) { $parentReturn[$key] = strval($parentReturn[$key]); } // 关联的字段,如 $user->post,相当于递归处理 if (is_array($parentReturn[$key])) { $parentReturn[$key] = new Resource($parentReturn[$key]); } } return $parentReturn; } }
次に、インターフェイス コントローラーで Resource を返してデータを返すと、整数フィールドの値が自動的に文字列になります。
<?php namespace App\Http\Controllers; use App\Http\Resources\Resource; use App\Models\User; use Illuminate\Http\Request; class TestController extends Controller { /** * @return \App\Http\Resources\Resource */ public function __invoke(Request $request) { $user = User::first(); return new Resource($user); } }
結果は以下のようになります。
注意事項
以上がLaravel が長整数のスノーフレーク ID を文字列に自動的に変換する方法を説明しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。