php - Laravel 5.1 将多个重复记录输入数据库

标签 php laravel laravel-5

我使用 Laravel 5.1 编写了一个应用程序。该应用程序用于 parking 位。它通过在数据库中创建 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()')]);
    }
}

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

最佳答案

在处理此类问题时,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()')]);
        }
    }
});

要真正确保数据完整性,您还需要 define a unique index跨 parking_bay、date 和 slot 列。您可能需要跳出迁移 API 并仅在迁移中执行 SQL 语句,这将根据您使用的是 MySQL、MSSQL、Postgres 等而有所不同。

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

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

关于php - Laravel 5.1 将多个重复记录输入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33628387/

相关文章:

php - 如何将来自 cURL 的数据显示到 PHP 中的表格中?

php - 如何更正此 SQL 查询的 PHP 代码?

mysql - Laravel 文件上传超时 - 添加 block 到 updateOrCreate?

php - 类型错误:传递给 Illuminate\Database\Grammar::parameterize() 的参数 1 必须是数组类型,整数给定

javascript - 我在 Laravel5.4 中的 DELETE Ajax 请求上收到 405(方法不允许)错误

php - 为两个单独的 DIV 标签分配 AJAX 响应

javascript - 使用 PHP SDK v4 的 Facebook 应用请求

mysql - 如何获取每个对话的最后一条消息

laravel - 集合到具有特定键的关联数组 [L5.2]

mysql - Laravel获取MySQL在Eloquent模型中查询Builder语句