Laravel - 插入DB :: rollback唯一密钥防护

时间:2017-09-26 12:12:49

标签: php database laravel

我的表格列 entry_id 列设置为唯一...

有没有最好的方法来使用try& catch和DB :: rollback来修改我的变量?例如:

$_id     = 1
$entryId = 'test0000'+$_id;
DB::beginTransaction();
try {
    $sub = Submission::create([
        'entry_id' => $entryId,
    ]);
    DB::commit();
    // success insert..

} catch (\Exception $e) {
    DB::rollback();
    //detected unique... just ++ _id to ensure not unique
    $_id++;
    // throw $e;
} catch (\Throwable $e) {
    DB::rollback();
    //detected unique... just ++ _id to ensure not unique
    $_id++;
    // throw $e;
}

第一次没有错误,我可能第二次知道,为了确保 entry_id 不唯一,我可以使用回滚方法输入++吗?这是正确的方法吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

我认为在你的情况下最好使用一个闭包。

DB::transaction(function() use ($entryId)
{
    $sub = Submission::create([
        'entry_id' => $entryId,
    ]);
});

您可以在闭包内链接查询,如果它在任何时候都失败,它将自动运行回滚。

答案 1 :(得分:0)

检查您的表引擎是否=MyISAM

并将其更改为 InnoDB

在 Laravel 中打开 config/database.php 在 mysql 设置引擎中 => 'InnoDB'

'connections' => [

    'mysql' => [
        'driver' => 'mysql',
        'url' => env('DATABASE_URL'),
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'prefix_indexes' => true,
        'strict' => true,
        'engine' => "InnoDB",
        'options' => extension_loaded('pdo_mysql') ? array_filter([
            PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
        ]) : [],
    ],
],

在那之后重新迁移 更改数据库中的引擎