CakePHP使用OR有很多连接条件

时间:2011-11-24 16:15:24

标签: php cakephp

在模型事件中,每个清单都应包含一个通用事件。此事件的listing_id为“0”。因此,如果列表没有事件。它将显示此通用事件。此外,如果它确实有事件......也将包含通用事件。

我已尝试使用OR复合数组的条件,但它不会将正确的AND更改为OR,如下所示。

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

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

2 个答案:

答案 0 :(得分:1)

尝试将关系更改为以下

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')),
    )
);

答案 1 :(得分:0)

Cake allows you to specify an OR condition中的正常find操作,但似乎Cake在关联条件下忽略了此结构。

下面的代码会生成您提出的查询,但Cake会忽略OR键。

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

您是否需要进行此设置?由于关联的条件数组似乎有点受限,您可能需要考虑在脚本中稍后添加泛型事件。例如,当您列出事件或单个事件时。