【问题标题】:Laravel - insert DB::rollback Unique key preventionLaravel - 插入 DB::rollback 唯一密钥预防
【发布时间】:2017-09-26 12:12:49
【问题描述】:

我的表列 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不唯一,我可以使用回滚方法进入++吗?这是正确的方法吗?

谢谢!

【问题讨论】:

    标签: php database laravel


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      检查您的表引擎是否 =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'),
              ]) : [],
          ],
      ],
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-19
        • 2021-01-15
        • 2010-09-08
        • 2023-04-04
        • 2020-07-28
        • 2020-04-12
        • 2018-05-11
        • 2014-07-21
        相关资源
        最近更新 更多