CakePHP имеет много условий соединения, используя ИЛИ - PullRequest
0 голосов
/ 24 ноября 2011

В модели Event есть общее событие, которое должно быть включено в каждый Листинг. Идентификационный листинг этого события - «0». Так что если в листинге нет события. Это покажет это общее событие. Также, если у него есть событие (я) ... Также будет включен и общий.

Я пробовал использовать условия с использованием составного массива ИЛИ, однако он не изменит правильное И на ИЛИ, как показано ниже.

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 ]

1 голос
/ 11 декабря 2012

Попробуйте изменить отношение на следующее

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')),
    )
);
0 голосов
/ 24 ноября 2011

Обычная find операция в Cake позволяет вам указать OR условие , но, похоже, Cake игнорирует эту структуру в условиях ассоциации.

Код нижебудет генерировать запрос, который вы предлагаете, но Cake игнорирует ключ OR.

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

Есть ли конкретная причина, по которой вы хотите эту настройку?Поскольку массив условий ассоциации выглядит немного ограниченным, вы можете рассмотреть возможность добавления общего события на более позднем этапе вашего сценария.Например, когда вы перечисляете события или одно событие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...