我在Laravel 5.2中使用postgresql开发一个REST API,用于处理具有start_time和end_time的不同机构的预订。用户可以在前端看到某些场所可用的差异时间并进行预订。这是有问题的情况:
在laravel中已经阅读了很多关于队列的内容,而且我不确定这是否是解决此问题的正确方法。
机构没有任意时间,因此客户可以预订1或2或3小时。
这是我的预订模式
Schema::create('bookings', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
$table->timestamp('start_time');
$table->timestamp('end_time');
$table->integer('user_id')->nullable();
$table->integer('establishment_id')->nullable();
$table->string('name')->nullable();
$table->string('phone_number')->nullable();
});
答案 0 :(得分:2)
注释指出原子数据更改应由数据库管理。在大多数现代关系数据库中有一些工具可以帮助解决这个问题,例如事务,外键,复合键和约束。 Eloquent和查询构建器都支持上述所有内容。
使用事务,您可以在读取/写入数据时锁定数据库表。如果发生故障,可以回滚所有更改。这意味着您可以执行多个相关操作/更改,并保证它们将一起失败/成功,并且在该事务期间不会发生外部数据更改。
由于您不限于单小时预订,因此简单的复合键不起作用,但您可以使用事务来查询插槽是否可用,然后在同一事务中预订插槽。这将通过laravel / qb与多个rdb实现兼容。
另一种可能更高效的方法是使用具有唯一约束的复合键,并在幕后预订多个1小时的时段 - 这会将预订时间限制为您使用的任何预订单位的倍数,例如1小时单位不允许预订1个半小时,您需要30分钟的单位