Не удается сохранить поле UUID в итерации PHP-скрипта, Laravel, Postgres - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь заполнить уже существующие модели 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

Ответы [ 4 ]

0 голосов
/ 04 октября 2018

Я думаю, что это какая-то ошибка в 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

0 голосов
/ 04 октября 2018

Я думаю, вы создали функцию для генерации UUID, но есть и другие лучшие способы генерации UUID.Вы используете Laravel, чтобы вы могли искать пакеты, которые генерируют UUID.

Есть пакет, который я предлагаю использовать.

https://github.com/ramsey/uuid

Эти типы пакетов полезны и полностью протестированы сообществом.Поэтому мы можем доверять им.

0 голосов
/ 04 октября 2018

Вы можете попробовать вот так ... он будет проверять, пока гид не станет действительно уникальным

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;
}
0 голосов
/ 04 октября 2018

Я считаю, что 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);
        }

    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...