我正在尝试用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
答案 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()'));
...
});
}
我觉得这样更优雅。