在Laravel7中如何使用UUID

小編給大家分享一下在Laravel7中如何使用UUID,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

在綏德等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),全網(wǎng)整合營(yíng)銷推廣,成都外貿(mào)網(wǎng)站制作,綏德網(wǎng)站建設(shè)費(fèi)用合理。

使用 UUIDs 的高級(jí)理由

A) 它們從你的 統(tǒng)一資源定位符 移除編號(hào)的 身份識(shí)別號(hào) ,故用戶不能看到你的應(yīng)用已創(chuàng)建多少確定的對(duì)象。例如:

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

對(duì)比:

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

B) 它們讓 身份識(shí)別號(hào) 遠(yuǎn)難于猜測(cè)。這有益于安全性,但我們可能應(yīng)當(dāng)實(shí)現(xiàn)其他技術(shù)以防范之。

作為主鍵實(shí)現(xiàn) UUIDs

如何改變數(shù)據(jù)庫(kù)遷移

首先,在數(shù)據(jù)庫(kù)遷移中,你要將當(dāng)前自動(dòng)遞增的 ID 字段替換為 UUIDs 。你還可以遵循以下方法:保留自動(dòng)遞增 ID 并將 UUID 作為表中的附加字段,在用戶展示 URL 時(shí)使用 (在這種情況下,你將 ID 隱藏到模型中),但這不是我們能在這里做的。 讓我們看看假設(shè)的 employees 表是什么樣子的。

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();
        });
    }

在這里,注意我們用 uuid() 替換了 normal id() ;并使其成為主鍵。

讓我們把它變成一種特質(zhì)

接下來(lái),我們可以實(shí)現(xiàn) Laravel 生命周期掛鉤,以確保在創(chuàng)建此模型的新實(shí)例時(shí)分配了 UUID。我們可以直接在模型中編寫代碼,但是如果你要在多個(gè)模型中使用 UUID,我建議用 Trait (我在這篇開發(fā)文章中學(xué)到了這一點(diǎn),非常感謝 Dev)。trait 基本上允許你創(chuàng)建功能,并通過(guò) use 關(guān)鍵字調(diào)用它在多個(gè)模型中使用。

要?jiǎng)?chuàng)建新的 Trait,請(qǐng)創(chuàng)建一個(gè) \App\Http\Traits\文件夾 (這僅僅是我的愛好,你也可以將其放到其他位置),并為 Trait 創(chuàng)建一個(gè)新文件。我們將調(diào)用文件 UsesUuid.php。

這是 trait 的具體代碼:

<?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 'string';
  }
}

使用 \Illuminate\Support\Str 輕松生成 UUID.。getIncrementing () 方法告訴 Laravel 該模型的主鍵不會(huì)自增 (因?yàn)槲覀冊(cè)O(shè)置的是 false), 而 getKeyType () 方法告訴 Laravel 該模型的主鍵是字符串類型。bootUsesUuid () 方法允許我們使用 Laravel 強(qiáng)大的生命周期鉤子。你可以 在這來(lái)哦藕節(jié)更多詳細(xì)信息。基本上我們的代碼已經(jīng)可以告訴 Laravel,當(dāng)創(chuàng)建該模型的新實(shí)例時(shí),為其設(shè)置 UUID 主鍵!

現(xiàn)在,我們可以使用 use 關(guān)鍵字在模型上輕松實(shí)現(xiàn)此特征。

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

將 UUID 引用為外鍵

要將表上的 UUID 引用為外鍵,只需更改表上外鍵字段的類型。如下...

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

... 我們?cè)谝?employee_id 外鍵時(shí)創(chuàng)建了一個(gè)無(wú)符號(hào)大整型的數(shù)據(jù)類型,對(duì)此進(jìn)行如下修改:

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

那樣簡(jiǎn)單!還有一件事...

UUID 和多態(tài)關(guān)系

您可能會(huì)發(fā)現(xiàn)自己通過(guò)自己的操作或要引入的包以多態(tài)關(guān)系引用了該模型。在遷移中,該表可能看起來(lái)像這樣:

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

在這里,morphs () 方法將在數(shù)據(jù)庫(kù)中創(chuàng)建兩個(gè)字段,即無(wú)符號(hào)大整型類型的 model_id 和字符串類型的 model_type。問(wèn)題在于我們的模型現(xiàn)在使用的是 UUID 而不是遞增的整數(shù) ID,因此這會(huì)給您帶來(lái)錯(cuò)誤,并顯示類似以下內(nèi)容::

Data truncated for column 'model_id' at row 1

我們現(xiàn)在需要 model_id 字段來(lái)支持我們的新 UUID,它的類型是 CHAR (36)。別擔(dān)心!Laravel 讓這件事變得超級(jí)簡(jiǎn)單,你不需要手動(dòng)做這件事。只需將遷移更改為:

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

以上是“在Laravel7中如何使用UUID”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

新聞標(biāo)題:在Laravel7中如何使用UUID
網(wǎng)頁(yè)網(wǎng)址:http://muchs.cn/article24/igspje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、外貿(mào)建站小程序開發(fā)、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作