无法在PHP脚本迭代,Laravel,Postgres中保存UUID字段

时间:2018-10-04 04:39:55

标签: laravel postgresql laravel-5

我正在尝试用UUID填充现有模型。而且每次它说UUID都不唯一!真该死! )))

  function unique_guid($model){
        $guid = com_create_guid();
        $table = $model->table;
        $db_table = Db::table($table);
        $req = $db_table->where("guid", strval($guid));
        $instance = $req->first();

        if(is_object($instance)){
            $guid = unique_guid($model);
            return;
        }else{
            try{
                $model->guid = $guid;
                $model->save();
                sleep(2);
                return $guid;
            }catch(PDOException $Exception){
                $guid = unique_guid($model);
            }

        }
    } 

它不断在try / catch块中盘旋,并告诉我它不是唯一的

我检查了,没有记录带有生成的UUID

也-它在第三至第四次迭代时中断,如果我添加sleep(5),它会工作更长的时间-10次迭代然后中断。 到底是什么? Laravel 5.5,Postgres 9

5 个答案:

答案 0 :(得分:0)

我相信com_create_guid并非在每次迭代中都生成唯一的,因此请使用一些增量/前缀值来生成UUID,还应尽可能使用uniqid而不是com_create_guid()uniqid根据当前时间(以微秒为单位)。

function unique_guid($model,$increment=0){
    $guid = uniqid($increment,TRUE);
    $table = $model->table;
    $db_table = Db::table($table);
    $req = $db_table->where("guid", strval($guid));
    $instance = $req->first();

    if(is_object($instance)){
        $guid = unique_guid($model,++$increment);
        return;
    }else{
        try{
            $model->guid = $guid;
            $model->save();
            sleep(2);
            return $guid;
        }catch(PDOException $Exception){
            $guid = unique_guid($model,++$increment);
        }

    }
} 

答案 1 :(得分:0)

我认为您创建了用于生成UUID的函数,但是还有其他一些更好的方法来生成UUID。您正在使用Laravel,因此可以搜索正在生成UUID的软件包。

我建议使用一个包装。

https://github.com/ramsey/uuid

这些类型的程序包非常有用,并经过社区的全面测试。这样我们就可以信任他们。

答案 2 :(得分:0)

您可以尝试这样。.它将检查直到GUID真正唯一

public static function generateUniqueNumber($model = null, $column = null)
{
    $num = null;
    if ($model) {
        $range = $model::all()->pluck('guid')->toArray();
        while (in_array($num = com_create_guid(), $range)) {}
    }

    return $num;
}

答案 3 :(得分:0)

我认为这是Postgres 9.3中的一些错误。它在脚本的某个位置一次插入两行。我只喜欢这样的迁移

 public function up()
    {
        DB::statement('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";');
        DB::statement('ALTER TABLE feegleweb_octoshop_products ADD COLUMN guid uuid DEFAULT uuid_generate_v4() UNIQUE;');
    }

它用唯一的uuid填充了我所有的行

答案 4 :(得分:0)

Laravel 6.0 official doc之后,我按照以下方式进行操作:

我在创建数据库时添加了 uuid-ossp 扩展名。然后,我的迁移就像:

use Illuminate\Database\Query\Expression;
...
public function up()
{
    Schema::create('my_table', function (Blueprint $table) {
        $table->uuid('guid')->primary()->default(new Expression('uuid_generate_v4()'));
        ...
    });
}

我觉得这样更优雅。