CakePHP有许多使用OR的连接条件

CakePHP有许多使用OR的连接条件,php,cakephp,Php,Cakephp,在模型事件中,每个列表都应包含一个通用事件。此事件的列表\u id为“0”。因此,如果列表中没有事件。它将显示此一般事件。如果它确实有事件。。。通用的也将包括在内 我尝试过使用或复合数组的条件,但它不会更改正确的AND to或,如下所示 var $hasMany = array( 'Event' => array( 'className' => 'Event', 'foreignKey' => 'listing_id',

在模型事件中,每个列表都应包含一个通用事件。此事件的列表\u id为“0”。因此,如果列表中没有事件。它将显示此一般事件。如果它确实有事件。。。通用的也将包括在内

我尝试过使用或复合数组的条件,但它不会更改正确的AND to或,如下所示

var $hasMany = array(
    'Event' => array(
        'className'  => 'Event',
        'foreignKey' => 'listing_id',
        'dependent'  => true,
        'conditions' => array('Event.listing_id' => '0'),
    )
);
上面的代码生成了这个SQL

SELECT `Event`.`id`, `Event`.`listing_id`, `Event`.`type_id`, `Event`.`when`, `Event`.`name`, `Event`.`description`, (DATE_FORMAT(`Event`.`when`, '%d')) AS `Event__day`, (DATE_FORMAT(`Event`.`when`, '%a')) AS `Event__dayN`, (DATE_FORMAT(`Event`.`when`, '%Y')) AS `Event__year`, (DATE_FORMAT(`Event`.`when`, '%h:%i %p')) AS `Event__time` FROM `events` AS `Event` WHERE `Event`.`listing_id1` = '0' AND `Event`.`listing_id` IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61)
需要改变这一点:

WHERE `Event`.`listing_id` = '0' AND `Event`.`listing_id` IN


Cake中的正常
find
操作,但在关联条件下Cake似乎忽略了此结构

下面的代码将生成您提议的查询,但Cake会忽略

array(
  "Event.listing_id" => 0,
  "OR" => array (
    "Event.listing_id" => array(1, 2, 3, 4, 5),
  )
)

您需要此设置的具体原因是什么?由于关联的条件数组看起来有点有限,您可能需要考虑在脚本的稍后点追加泛型事件。例如,当您列出事件或单个事件时。

尝试将关系更改为以下内容

public $hasMany = array(
    'Event' => array(
        'className'  => 'Event',
        'foreignKey' => false,
        'dependent'  => true,
        'conditions' => array('or' => array(
            'Event.listing_id' => '0', 
            'Event.listing_id' => 'Listing.id'
        )),
    )
);
你可能会侥幸逃脱

public $hasMany = array(
    'Event' => array(
        'className'  => 'Event',
        'foreignKey' => 'listing_id',
        'dependent'  => true,
        'conditions' => array('or' => array('Event.listing_id' => '0')),
    )
);

因为对这个模型的每次调用都需要包含这个。我想如果在返回结果之前修改结果,afterFind函数可能是唯一的方法。另外,我没有生成“IN”部分,因为它是关联的一部分。在这种情况下,
afterFind
可能确实是第二个最佳选择,因为删除
部分中多余的
,并嵌套
“事件”。在
数组中列出\u id”=>0
也不起作用。
public $hasMany = array(
    'Event' => array(
        'className'  => 'Event',
        'foreignKey' => 'listing_id',
        'dependent'  => true,
        'conditions' => array('or' => array('Event.listing_id' => '0')),
    )
);