【问题标题】:Laravel 5.1 entering multiple duplicate records into the databaseLaravel 5.1 将多条重复记录输入数据库
【发布时间】:2015-11-10 10:55:25
【问题描述】:

我使用 Laravel 5.1 编写了一个应用程序。该应用程序适用于停车位。它通过在数据库中创建 3 个不同的可用插槽(早上、下午、全天)来“提供”空间。

问题是在快速页面刷新时,空间被配置了两次,导致 6 个插槽被输入到数据库中。

但是,如果我在延迟 5 秒后刷新页面,则不会输入更多记录。我下面的 if 语句似乎有效,只是在快速刷新页面/连接时无效。

foreach($bays as $bay) {
    if(!BookingDates::where('date', $date)->where('parking_bay', $bay->number)->count()) {
        BookingDates::insert(['parking_bay' => $bay->number, 'date' => $date, 'slot' => 'Morning', 'time' => '7am - 1pm', 'status' => 'Available', 'created_at' => DB::raw('now()')]);
        BookingDates::insert(['parking_bay' => $bay->number, 'date' => $date, 'slot' => 'Afternoon', 'time' => '1pm - 7pm', 'status' => 'Available', 'created_at' => DB::raw('now()')]);
        BookingDates::insert(['parking_bay' => $bay->number, 'date' => $date, 'slot' => 'All Day', 'time' => null, 'status' => 'Available', 'created_at' => DB::raw('now()')]);
    }
}

有谁知道为什么会发生这种情况?

【问题讨论】:

  • 您总是可以在请求之前添加过滤器以检查可能的数据库冲突
  • 但我不明白为什么他们被多次输入?某处有解释吗?我从没想过这是可能的。
  • 请发布您的路线以及它们是如何处理的(关闭和/或控制器操作)。如果您发布到与输入预订的路线不同的路线,则不应发生这种情况。
  • @V4n1ll4 这是指向GET 还是POST?通常情况下,如果它是一个帖子并且您尝试过两次发布数据,则必须给予确认。

标签: php laravel laravel-5


【解决方案1】:

在处理此类问题时,database transactions 通常会成为解决方案的一部分。代码将如下所示:

DB::transaction(function () use ($bays, $date){
    foreach($bays as $bay) {
        if(!BookingDates::where('date', $date)->where('parking_bay', $bay->number)->count()) {
            BookingDates::insert(['parking_bay' => $bay->number, 'date' => $date, 'slot' => 'Morning', 'time' => '7am - 1pm', 'status' => 'Available', 'created_at' => DB::raw('now()')]);
            BookingDates::insert(['parking_bay' => $bay->number, 'date' => $date, 'slot' => 'Afternoon', 'time' => '1pm - 7pm', 'status' => 'Available', 'created_at' => DB::raw('now()')]);
            BookingDates::insert(['parking_bay' => $bay->number, 'date' => $date, 'slot' => 'All Day', 'time' => null, 'status' => 'Available', 'created_at' => DB::raw('now()')]);
        }
    }
});

要真正确保数据完整性,您还需要在parking_bay、date 和slot 列中使用define a unique index。您可能需要跳出迁移 API,只需在迁移中执行一条 SQL 语句,具体取决于您使用的是 MySQL、MSSQL、Postgres 等。

在事务和唯一索引之间,数据库将拒绝插入重复的行并回滚错误的插入,因此您不会遇到诸如一个人有早上时段而另一个人有全天时段的情况。

如果您需要任何进一步的帮助,请告诉我!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 2015-10-17
    相关资源
    最近更新 更多