使用laravel

时间:2017-06-28 20:06:59

标签: php postgresql laravel-5 concurrency

我在Laravel 5.2中使用postgresql开发一个REST API,用于处理具有start_time和end_time的不同机构的预订。用户可以在前端看到某些场所可用的差异时间并进行预订。这是有问题的情况:

  1. 客户A想要预订机构。看到企业A在15:00至20:00之间免费
  2. 客户A选择16:00至17:00的时间。 (必须按一个按钮确认预订)
  3. 客户B想要预订机构。看到企业A从15:00到20:00免费
  4. 客户B选择16:00至17:00 apointment(再次,必须按一个按钮确认预订)
  5. 客户A确认预订
  6. 如果客户B确认预订,我们将同时进行2次预订。
  7. 在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();
    
        });
    

1 个答案:

答案 0 :(得分:2)

注释指出原子数据更改应由数据库管理。在大多数现代关系数据库中有一些工具可以帮助解决这个问题,例如事务,外键,复合键和约束。 Eloquent和查询构建器都支持上述所有内容。

使用事务,您可以在读取/写入数据时锁定数据库表。如果发生故障,可以回滚所有更改。这意味着您可以执行多个相关操作/更改,并保证它们将一起失败/成功,并且在该事务期间不会发生外部数据更改。

由于您不限于单小时预订,因此简单的复合键不起作用,但您可以使用事务来查询插槽是否可用,然后在同一事务中预订插槽。这将通过laravel / qb与多个rdb实现兼容。

另一种可能更高效的方法是使用具有唯一约束的复合键,并在幕后预订多个1小时的时段 - 这会将预订时间限制为您使用的任何预订单位的倍数,例如1小时单位不允许预订1个半小时,您需要30分钟的单位

laravel transactions

laravel create composite indexes