Контролируемая проблема поведения с нестандартными ключами? - PullRequest
0 голосов
/ 03 апреля 2011

Я работаю с унаследованной базой данных, ключи которой следуют соглашению, но, к сожалению, не соглашению о торте, и я столкнулся с чем-то странным в поведении сдерживаемости - это получение неверных данных.Вот мои настройки:

TechnologyIncentive belongsTo...
  array(
    'Incentive' => array(
      'className'  => 'Incentive',
      'type'       => 'inner',
      'foreignKey' => false, # actually 'incentive_id', but we need to fool Cake
      'conditions' => array( 'TechnologyIncentive.incentive_id = Incentive.incentive_id' ),
    ),
    'Technology' => array(
      'className'  => 'Technology',
      'type'       => 'inner',
      'foreignKey' => false, # actually 'incentive_tech_id', but we need to fool Cake
      'conditions' => array( 'TechnologyIncentive.incentive_tech_id = Technology.incentive_tech_id' )
    ),
  );

Вы можете видеть, что мне пришлось обмануть Cake при работе с моими нестандартными ключами, установив для foreignKey значение false и определив ссылку в предложении where.Пока все хорошо.

Теперь, когда я пытаюсь выполнить запрос от TechnologyIncentive модели:

$this->find( 'all', array(
  'contain' => array( 'Incentive', 'Technology' ),
  'fields'  => array( 'Incentive.name', 'Technology.name', 'TechnologyIncentive.amount' ),
  'conditions' => array( /** conditions... */ )
);

Все отлично работает.Вещи хорошо содержатся, и я получаю именно то, что ожидаю.Затем мне нужно включить TechnologyGroup, который hasMany Technology и вещи почему-то разбиваются.

Теперь моя опция contain выглядит следующим образом:

'contain' => array( 'Incentive', 'Technology' => array( 'TechnologyGroup' ) )

И что я получаюзадняя запись Incentive содержит поощрительную запись.Это не совсем удивительно, так как я указываю несколько полей в одном месте (основной параметр fields) и неявно все поля в параметре contain, но что мне действительно странно 1023 *, так это то, что они 'Ре разные стимулы.«Содержащийся» стимул является просто неправильным.

При проверке SQL выглядит, как будто запрос был выполнен без какого-либо эффективного условия where, поэтому все извлекается, а затем искусственно ограничивается одной записью.Обратите внимание на разницу между $result['Incentive']['incentive_id'] и $result['Incentive']['Incentive']['incentive_id'].

Array
(
  [Incentive] => Array
    (
      [incentive_id] => MD046
      [name] => Incentive name
      [category] => 
      [Incentive] => Array
        (
          [incentive_id] => AK004
          [code] => AK04F
          [version] => 2
          [category] => Incentive Category
        )

    )
)

Кто-нибудь когда-нибудь сталкивался с этим?Это не проблема, пока я не хочу получить расширенную запись (TechnologyGroup).Любые мысли будут высоко ценится.

1 Ответ

0 голосов
/ 10 апреля 2011

Похоже, это было напрямую связано с нестандартными ключами.Поведение Containable, более того, кажется, что другие элементы Cake действительно хотят соблюдения соглашения.Более того, некоторые ключевые ассоциации включали двойное подчеркивание (__) в имя поля, что вызывало другие проблемы.

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

...