Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 5.1将多个重复记录输入数据库_Php_Laravel_Laravel 5 - Fatal编程技术网

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

Php Laravel 5.1将多个重复记录输入数据库,php,laravel,laravel-5,Php,Laravel,Laravel 5,我已经使用Laravel5.1编写了一个应用程序。此应用程序适用于停车位。它通过在数据库中创建3个不同的可用插槽(上午、下午、全天)来“调配”空间 问题是,在快速页面刷新时,空间被设置两次,导致数据库中输入6个插槽 但是,如果我在5秒延迟后刷新页面,则不会输入更多记录。下面的if语句似乎有效,只是在页面/连接快速刷新时无效 foreach($bays as $bay) { if(!BookingDates::where('date', $date)->where('parking_

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

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

在处理这类问题时,往往是解决方案的一部分。代码将如下所示:

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()')]);
        }
    }
});
为了真正确保数据的完整性,您还需要跨越列(如间隔、日期和插槽)。您可能需要跳出迁移API,在迁移中只执行SQL语句,这将根据您是否使用MySQL、MSSQL、Postgres等而有所不同

在事务和唯一索引之间,数据库将拒绝插入重复的行,并将回滚错误的插入,因此您不会被一个人占用上午的时间而另一个人占用全天的时间这样的事情所困扰


如果你需要进一步的帮助,请告诉我

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