RESTful 从 Angular 到 Sails.js 的日期查询

A RESTful query from Angular to Sails.js with dates

我正在使用 sails-mysql Waterline 适配器将 Sails,js 与我的 Mysql 数据库连接,该数据库以这种格式存储日期:"YYYY-MM-DD HH:MM:SS"。 在默认 Sails.js 蓝图不变的情况下,我正在从 Angular.js 服务中执行以下查询:

CheckAvailability: function(arrival,departure,room){

                departure = moment(departure).endOf('day').format();

                arrival = moment(arrival).startOf('day').format();

                var bookingList = $resource(IP_ADDRESSES.dbserver+'bookings');

                return bookingList.query({

                    or:[{                            
                                departure: {'>=': arrival},
                                departure: {'<=': departure}                                                     

                        },{
                                arrival:{'>=':arrival},
                                arrival:{'<=':departure}

                        },{
                                arrival: {'<=': arrival},
                                departure: {'>=': departure}
                        }

                    ],

                    where:{room:room}}).$promise;
}

返回结果不正确,我得到了所选房间的所有预订,而不是只收到超订房间。

我通常将 ISO 8601 字符串与 where 结合使用。

Moment 具有 endOf()startOf() 函数,可用于获取 "last/fisrt instant of a day",未参数化的 format() 将转换为 ISO 8601 字符串:

CheckAvailability: function(arrival,departure,room){
  arrival = moment(arrival);
  departure = moment(departure);

  var bookingList = $resource(IP_ADDRESSES.dbserver+'bookings');

  return bookingList.query({
    or:[{                            
      departure: {'>=': arrival.startOf('day').format()},
      departure: {'<=': departure.endOf('day').format()}                                                     
    },{
      arrival:{'>=':arrival.startOf('day').format()},
      arrival:{'<=':departure.endOf('day').format()}
    },{
      arrival: {'<=': arrival.endOf('day').format()},
      departure: {'>=': departure.startOf('day').format()}
    }],
    where:{room:room}})
  .$promise;

您确定在同一个请求中混合使用 querywhere 有效吗?我认为它 应该 工作,这要归功于对蓝图路线的隐式 actionUtil.parseCriteria(req) 调用;但值得尝试将日期查询嵌入 inside where。听起来 where 是唯一处理的条件,不是吗?


注意:稍后 parseCriteria 会抢到 link,我现在在 iPad。

这个

or:[{                            
  departure: {'>=': arrival},
  departure: {'<=': departure}
},{
  arrival:{'>=':arrival},
  arrival:{'<=':departure}
},{
  arrival: {'<=': arrival},
  departure: {'>=': departure}
}]

不是有效的水线条件。

AND 运算符是通过将多个运算符添加到同一个键来完成的:

or:[{                            
  departure: {'>=': arrival, '<=': departure},
},{
  arrival:{'>=':arrival, '<=':departure},
},{
  arrival: {'<=': arrival},
  departure: {'>=': departure}
}]

顺便说一句,请注意 var b = {a:1, a:2} 是 Javascript 胡说八道。你会得到一个唯一的 b.a 属性 ,其值为...嗯...我想这完全取决于实现(Node.js,浏览器)并且是不可预测的?