V4n*_*ll4 5 php laravel laravel-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()')]);
}
}
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么会这样?
在处理此类问题时,数据库事务通常是解决方案的一部分。代码看起来像这样:
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()')]);
}
}
});
Run Code Online (Sandbox Code Playgroud)
为了真正确保数据完整性,您还需要在 parking_bay、date 和 slot 列之间定义唯一索引。您可能需要跳出迁移 API,只在迁移中执行 SQL 语句,这会根据您是否使用 MySQL、MSSQL、Postgres 等而有所不同。
在事务和唯一索引之间,数据库将拒绝插入重复的行,并将回滚错误的插入,因此您不会陷入一个人拥有早上时段而另一个人拥有全天时段的情况。
如果您需要任何进一步的帮助,请告诉我!