検索
ホームページPHPフレームワークLaravelLaravel 7 で UUID を適切に使用するためのチュートリアル

Laravel 7 で UUID を適切に使用するためのチュートリアル

最近、Laravel 7 で Universal Unique Identifier (UUID) を実装する必要があり、いくつかの問題に遭遇しました。この投稿が同じことをしている他の人に役立つことを願っています。

UUID を使用する高度な理由

A) UUID では、Uniform Resource Locator から番号付きの識別子が削除されるため、ユーザーは特定のオブジェクトの数を確認できません。アプリが作成しました。例:

https://myapp.com/api/users/5

コントラスト:

https://myapp.com/api/users/0892b118-856e-4a15-af0c-66a3a4a28eed

B) これらにより、識別番号を推測することがはるかに困難になります。これはセキュリティにとっては良いことですが、おそらくそれを防ぐために他の技術を実装する必要があります。

UUID を主キーとして実装する

データベース移行を変更する方法

まず、データベースの移行では、現在の自動インクリメント ID フィールドを UUID に置き換えたいと考えています。このアプローチに従うこともできます。自動インクリメント ID を保持し、ユーザーに URL が表示されるときに使用されるテーブル内の追加フィールドとして UUID を使用します (この場合、モデル内で ID を非表示にします)。私たちがここでできることではありません。仮想の従業員テーブルがどのようなものかを見てみましょう。

public function up()
    {
        Schema::create('employees', function (Blueprint $table) {
            $table->uuid('id')->primary;
            $table->string('name');
            $table->string('email')->unique();
            $table->string('work_location')->nullable();
            $table->timestamps();
        });
    }

ここでは、通常の id() を uuid(); に置き換え、それを主キーにしていることに注目してください。

これを特性にしましょう

次に、Laravel ライフサイクル フックを実装して、このモデルの新しいインスタンスが作成されるときに UUID が割り当てられるようにします。モデルにコードを直接記述することもできますが、複数のモデルで UUID を使用する場合は、Traits を使用することをお勧めします (これについては、この開発記事で学びました。開発者に感謝します)。特性を使用すると、基本的に機能を作成し、それを use キーワード経由で呼び出して複数のモデルで使用できるようになります。

新しい Trait を作成するには、 \App\Http\Traits\ フォルダー (これは私の趣味です。他の場所に置いても構いません) を作成し、 Trait 用の新しいファイルを作成します。ファイルを UsesUuid.php と呼びます。

これは特性の特定のコードです:

<?php
namespace App\Http\Traits;
use Illuminate\Support\Str;
trait UsesUuid
{
  protected static function bootUsesUuid() {
    static::creating(function ($model) {
      if (! $model->getKey()) {
        $model->{$model->getKeyName()} = (string) Str::uuid();
      }
    });
  }
  public function getIncrementing()
  {
      return false;
  }
  public function getKeyType()
  {
      return &#39;string&#39;;
  }
}

\Illuminate\Support\Str を使用して UUID を簡単に生成します。 getIncrementing () メソッドは、モデルの主キーがインクリメントされないこと ( false に設定しているため) を Laravel に伝え、 getKeyType () メソッドは、モデルの主キーが文字列型であることを Laravel に伝えます。 bootUsesUuid() メソッドを使用すると、Laravel の強力なライフサイクル フックを使用できます。欧陽節の詳細については、こちらをご覧ください。基本的に、私たちのコードはすでに Laravel に、このモデルの新しいインスタンスが作成されるときに、それに UUID 主キーを設定するように指示しています。

use キーワードを使用して、この機能をモデルに簡単に実装できます。

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
...
class Employee extends Model
{
    ...
    use \App\Http\Traits\UsesUuid;
    ...
}

UUID を外部キーとして参照

テーブル上の UUID を外部キーとして参照するには、テーブル上の外部キー フィールドのタイプを変更するだけです。 。次のように...

 Schema::create(&#39;another_table&#39;, function(Blueprint $table) {
        $table->id();
        $table->unsignedBigInteger(&#39;employee_id&#39;);
        $table->string(&#39;some_field&#39;);
        $table->foreign(&#39;employee_id&#39;)
            ->references(&#39;id&#39;)
            ->on(&#39;shifts&#39;)
            ->onDelete(&#39;cascade&#39;);
    });

... 外部キーemployee_idを参照するときに符号なしの大きな整数データ型を作成し、それを次のように変更しました。

 Schema::create(&#39;another_table&#39;, function(Blueprint $table) {
        $table->id();
        $table->uuid(&#39;employee_id&#39;);
        $table->string(&#39;some_field&#39;);
        $table->foreign(&#39;employee_id&#39;)
            ->references(&#39;id&#39;)
            ->on(&#39;shifts&#39;)
            ->onDelete(&#39;cascade&#39;);
    });

これは非常に簡単です。もう 1 つ...

UUID とポリモーフィックな関係

独自の操作またはインポートしているパッケージを通じて、ポリモーフィックな関係で参照していることに気づくかもしれません。モデル。移行では、テーブルは次のようになります。

    public function up()
    {
        Schema::create(&#39;some_package_table&#39;, function (Blueprint $table) 
        {
            $table->bigIncrements(&#39;id&#39;);
            $table->morphs(&#39;model&#39;);
            ...
        }
    }

ここで、morphs () メソッドは、データベースに 2 つのフィールド、符号なし整数型の model_id と文字列型の model_type を作成します。問題は、モデルが増分する整数 ID の代わりに UUID を使用していることです。そのため、次のようなエラーが表示されます。 :

Data truncated for column &#39;model_id&#39; at row 1

新しい UUID をサポートするには、model_id フィールドが必要です。型はCHAR(36)です。心配しないで! Laravel を使用するとこれが非常に簡単になり、手動で行う必要がありません。移行を次のように変更するだけです:

    public function up()
    {
        Schema::create(&#39;some_package_table&#39;, function (Blueprint $table) 
        {
            $table->bigIncrements(&#39;id&#39;);
            $table->uuidMorphs(&#39;model&#39;);
            ...
        }
    }

Laravel を愛するもう 1 つの理由!コーディングを楽しんでください!

推奨チュートリアル: 「Laravel チュートリアル

以上がLaravel 7 で UUID を適切に使用するためのチュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はlearnkuで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
最新のLaravelバージョンは何ですか?最新のLaravelバージョンは何ですか?May 09, 2025 am 12:09 AM

2023年10月の時点で、Laravelの最新バージョンは10.xです。 1.Laravel10.xはPHP8.1をサポートし、開発効率を向上させます。 2.JetStreamは、LiveWireとInertia.jsのサポートを改善し、フロントエンドの開発を簡素化します。 3.ELOQUENTORMフルテキスト検索機能を追加して、データ処理のパフォーマンスを向上させます。 4.依存関係パッケージの互換性に注意してください。それを使用して、キャッシュ最適化パフォーマンスを適用してください。

Laravelの移行:データベース管理に関する初心者向けガイドLaravelの移行:データベース管理に関する初心者向けガイドMay 09, 2025 am 12:07 AM

laravelMigrationsStreamLedinedAtabaseManagementByprovidingviding version controlforyourdatabaseschema.1)theyoutodedodefineSteStretructure ofyourdatabase、Making eaSytomeChangeSesime.2)移民の移民は、環境を取得することを確認します

Laravel Migration:ベストコーディングガイドLaravel Migration:ベストコーディングガイドMay 09, 2025 am 12:03 AM

Laravelの移行システムは、開発者がデータベースを設計および管理するための強力なツールです。 1)移行ファイルに明確に名前が付けられていることを確認し、動詞を使用して操作を説明します。 2)フィールドに一意の制約を追加するなど、データの整合性とパフォーマンスを検討します。 3)トランザクション処理を使用して、データベースの一貫性を確保します。 4)パフォーマンスを最適化するために、移行の最後にインデックスを作成します。 5)移行の原子性を維持すると、各ファイルには1つの論理操作のみが含まれます。これらのプラクティスを通じて、効率的で保守可能な移行コードを作成できます。

最新のLaravelバージョン:最新の機能を最新の状態に保ちます最新のLaravelバージョン:最新の機能を最新の状態に保ちますMay 09, 2025 am 12:03 AM

Laravelの最新バージョンは2023年初頭にリリースされた10.xです。このバージョンは、Eloquentormの機能と簡素化されたルーティングシステムをもたらし、開発効率とパフォーマンスを向上させますが、問題を防ぐためにアップグレード中に慎重にテストする必要があります。

Mastering Laravel Soft Deletes:ベストプラクティスと高度なテクニックMastering Laravel Soft Deletes:ベストプラクティスと高度なテクニックMay 08, 2025 am 12:25 AM

laravelsoftdeleteSallow withoutremovingRecordsfromthedatabase.to implement:1)usetheSoftdeStreateStraitinyourModel.2)usetrashed()toincludeSoft-deletedRecordSinqueries.3)createcustomscopeslisededcoded()for Strimed()for

Laravel Soft Deletes:レコードの復元と永続的な削除Laravel Soft Deletes:レコードの復元と永続的な削除May 08, 2025 am 12:24 AM

Laravelでは、Restore()メソッドを使用してソフト削除されたレコードを復元し、ForcedElete()メソッドを永続的に削除します。 1)trashed() - > find() - > restore()を使用して単一のレコードを復元し、onlytrashed() - > restore()を使用して単一のレコードを復元します。 2)withtrashed() - > find() - > forcedelete()を使用して単一のレコードを永続的に削除し、複数のレコードを使用してonlytrashed() - > forcedelete()を使用します。

現在のLaravelリリース:今日ダウンロードしてアップグレードしてください!現在のLaravelリリース:今日ダウンロードしてアップグレードしてください!May 08, 2025 am 12:22 AM

拡張されたEloquentorm機能と新しいルーティング機能を提供するため、最新のLaravelバージョンをダウンロードしてアップグレードする必要があります。アップグレードするには、次の手順に従います。1。現在のアプリケーションをバックアップします。2。composer.jsonファイルを最新バージョンに更新します。3。更新コマンドを実行します。破棄された機能やパッケージの互換性など、いくつかの一般的な問題が発生する可能性がありますが、これらの問題は参照文書とコミュニティサポートを通じて解決できます。

Laravel:最後のバージョンにいつ更新する必要がありますか?Laravel:最後のバージョンにいつ更新する必要がありますか?May 08, 2025 am 12:18 AM

あなたは、clearlylyly outweighthecosts.1)newfeaturesandimprovementscanenhanceourapplication.2)securityupdateseupdates arecrneraptreaddressed.3)パフォーマンスゲインズマイスハイティファーアップデートアップアップドラッドルスエルアップアップルームスルズエンス

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。