Cakephp 3-';匹配';-如何过滤预订系统的数据?

Cakephp 3-';匹配';-如何过滤预订系统的数据?,cakephp,associations,filtering,query-builder,cakephp-3.x,Cakephp,Associations,Filtering,Query Builder,Cakephp 3.x,我有“住宿单元”和“住宿预订”表,我想检查一段时间内住宿单元的可用性。例如,到达日期:2019-08-20,离开日期:2019-08-27 住宿单位表如下所示: “住宿预订”表如下所示: 此代码不起作用: $this->loadModel('AccommodUnits'); $this->conditionBookings = [ 'NOT' => [ [ 'AccommodBookings.date_

我有
“住宿单元”
“住宿预订”
表,我想检查一段时间内住宿单元的可用性。例如,到达日期:2019-08-20,离开日期:2019-08-27

住宿单位表如下所示:

“住宿预订”表如下所示:

此代码不起作用:

$this->loadModel('AccommodUnits');            
$this->conditionBookings = [
    'NOT' => [
        [
            'AccommodBookings.date_start >=' => '2019-08-20',
            'AccommodBookings.date_end <=' => '2019-08-27'
        ], 
    ]
];         
$accommodUnits = $this->AccommodUnits
    ->find('all')
    ->distinct(['AccommodUnits.id'])
    ->contain([
        'AccommodBookings' => function ($q) {
            return $q->where($this->conditionBookings);
        },                 
    ])
    ->where($conditionUnits)
    ->matching('AccommodBookings', function ($q) {
        return $q->where($this->conditionBookings);
    });

如何解决这个问题?

很简单,您必须重叠预订期

[
    'AccommodBookings.date_start <=' => '2019-08-27', // Here put end date greater than start date <=
    'AccommodBookings.date_end >=' => '2019-08-20' // Here put start date smaller than end date  >=
],
上面的示例将找到所有未使用 word枯燥乏味

波兹

[
    'AccommodBookings.date_start <=' => '2019-08-27', // Here put end date greater than start date <=
    'AccommodBookings.date_end >=' => '2019-08-20' // Here put start date smaller than end date  >=
],
$this->loadModel('AccommodUnits');
$accommodBookings = [
        'AccommodBookings.date_start <=' => '2019-08-27', // not match start date lower than end date
        'AccommodBookings.date_end >=' => '2019-08-20' // not mach end date greater than start date
];

$accommodUnits = $this->AccommodUnits
    ->find() // if empty default is 'all'
    ->where(['AccommodUnits.id' => 124]) // find units 124 where not matching:
    ->notMatching('AccommodBookings', function ($q) use ($accommodBookings) {
        return $q->where($accommodBookings);
    });
// In a controller or table method.

$query = $articlesTable
    ->find()
    ->notMatching('Tags', function ($q) {
        return $q->where(['Tags.name' => 'boring']);
    });