Laravel 5.1将多个重复记录输入到数据库中。

5
我已经使用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()')]);
    }
}

有人知道为什么会出现这种情况吗?


1
您可以在请求之前始终添加过滤器以检查可能的数据库冲突。 - IlGala
但我不明白为什么它们会被输入多次?有解释吗?我从未想过这是可能的。 - V4n1ll4
请发布您的路由以及它们是如何处理的(使用闭包和/或控制器操作)。如果您要发布到与输入预订的路由不同的路由,则不应该发生这种情况。 - Bogdan
1
@V4n1ll4 这是指向“GET”还是“POST”?通常,如果是“POST”并且您尝试两次提交数据,您需要确认。 - Phorce
1个回答

1

在处理这种问题时,数据库事务通常是解决方案的一部分。代码将类似于以下内容:

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上定义唯一索引。您可能需要走出迁移API并在迁移中执行SQL语句,具体取决于您是否使用MySQL、MSSQL、Postgres等。
通过事务和唯一索引,数据库将拒绝插入重复行并回滚错误的插入操作,因此您不会陷入一个人拥有早晨时段而另一个人拥有全天时段的情况。
如果您需要进一步帮助,请告诉我!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接