CakePHP 3中具有动态间隔的MYSQL DATE_ADD

时间:2019-04-12 10:56:28

标签: cakephp cakephp-3.0

我在cakephp 3.7.5 Controller中解决了一个问题。在特定的我正在使用MySQL函数DATE_ADD,在查询我的资源控制器的索引方法时,但是在DATE_ADD(field,INTERVAL value)的值中,我需要获取一个动态值,例如(例如:1 DAY,WEEK)或其他内容),因为资源表的每个记录都有一个称为recovery_time的字段的值。我如何获得动态价值?每个资源都有一个ID,该ID与另一个称为“不可用”的表结合在一起,在其中我们可以找到预订的开始/结束日期。

$unavailable_resource_ids = $this->Resources->Unavailabilities
->find()
->select(['resource_id'])
->matching('Bookings', function ($q) {
   return $q->where(['Bookings.booking_status_id NOT IN ' => [6, 4, 3]]);
  }) 
->where([
  'OR' => [
    ['Unavailabilities.start <= :start_date', 'DATE_ADD(Unavailabilities.end, INTERVAL '. $recovery .') >= :end_date'],
    ['Unavailabilities.start <= :start_date', 'DATE_ADD(Unavailabilities.end, INTERVAL '.  $recovery .') BETWEEN :start_date AND :end_date'],
    ['Unavailabilities.start BETWEEN :start_date AND :end_date', 'DATE_ADD(Unavailabilities.end, INTERVAL '. $recovery .') >= :end_date'],
    ['Unavailabilities.start >= :start_date', 'DATE_ADD(Unavailabilities.end, INTERVAL '. $recovery .') <= :end_date']
]
])
->bind(':start_date', $start_date_object, 'datetime')
->bind(':end_date', $end_date_object, 'datetime');

我有一个解决方案,我在INTERVAL中添加了一个子查询,下面是代码,也许对其他人有用。

$unavailable_resource_ids = $this->Resources->Unavailabilities
->find()
->select(['resource_id'])
->matching('Bookings', function ($q) {
  return $q->where(['Bookings.booking_status_id NOT IN ' => [6, 4, 3]]);
  })
->where([
  'OR' => [
  ['Unavailabilities.start <= :start_date', 'DATE_ADD(Unavailabilities.end,     INTERVAL (SELECT resources.recovery_time FROM resources WHERE id = Unavailabilities.resource_id) DAY) >= :end_date'],
  ['Unavailabilities.start <= :start_date', 'DATE_ADD(Unavailabilities.end, INTERVAL (SELECT resources.recovery_time FROM resources WHERE id = Unavailabilities.resource_id) DAY) BETWEEN :start_date AND :end_date'],
  ['Unavailabilities.start BETWEEN :start_date AND :end_date', 'DATE_ADD(Unavailabilities.end, INTERVAL (SELECT resources.recovery_time FROM resources WHERE id = Unavailabilities.resource_id) DAY )  >= :end_date'],
  ['Unavailabilities.start >= :start_date', 'DATE_ADD(Unavailabilities.end, INTERVAL (SELECT resources.recovery_time FROM resources WHERE id = Unavailabilities.resource_id) DAY) <= :end_date']
]
])

-> bind(':start_date',$ start_date_object,'datetime')  -> bind(':end_date',$ end_date_object,'datetime');`

0 个答案:

没有答案