CakePHP bindModel работает, предустановленные ассоциации моделей не - PullRequest
2 голосов
/ 29 января 2011

Я занимаюсь разработкой личного проекта.

У меня есть две модели «Шоу» и «Эпизод». У меня есть один контроллер 'Ops'.

Показать модель:

class Show extends AppModel
{
 var $name = 'Show';

 var $hasMany = array(
  'Episode' => array(
   'className' => 'Episode',
   'foreignKey' => 'show_id'
  )
 );
}

Модель серии:

class Episode extends AppModel
{
 var $name = 'Episode';

 var $belongsTo = array(
  'Show' => array(
   'className' => 'Show',
   'foreignKey' => 'show_id'
  )
 ); 
}

Контроллер Ops:

class OpsController extends AppController
{
 var $name = 'Ops';
 var $uses = array('Show','Episode');

 function index()
 {
  $episodes = $this->Episode->find('all',array(
   'limit' => 10,
   'order' => array('Episode.first_aired' => 'DESC'),
   )
  );
  debug($this->Episode);
  debug($episodes);

 }
}

При запуске контроллера Ops я получаю записи «Episode» так, как хочу, но не получаю связанную запись «Show», основанную на «show_id» в конфигурации «ownTo». Похоже, что он вообще не ссылается на модель, поскольку я могу целенаправленно нарушать класс модели, и запрос все еще продолжается.

После долгих проверок, исследований и тестирования я смог заставить его работать, добавив в контроллер Ops перед запросом find () следующее:

$this->Episode = ClassRegistry::init('Episode');
$this->Episode->bindModel(
 array('belongsTo' => array(
   'Show' => array(
    'className' => 'Show'
   )
  )
 )
);

Теперь, пока это работает, я все еще хотел бы знать, почему мои модели не вызывают должным образом. Любая помощь будет наиболее ценной. Спасибо!

Ответы [ 3 ]

0 голосов
/ 31 января 2011

Похоже, Cake не использует файлы вашей модели, а вместо этого автоматически генерирует некоторые из них на основе таблиц.Звучит глупо, но проверьте папки и имена файлов на наличие орфографических ошибок и убедитесь, что они строчные.

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

В вашей модели Show у вас есть внешний ключ Episode, установленный в show_id, который должен быть episode_id.Однако я не думаю, что это является причиной проблемы.

Вы не меняете никаких соглашений о присвоении имен CakePHP, как я могу сказать, поэтому просто удалите массивы, определяющие ассоциацию, и оставьте их в виде строки, например:

class Show extends AppModel
{
 var $name = 'Show';

 var $hasMany = array(
  'Episode'
 );
}

class Episode extends AppModel
{
 var $name = 'Episode';

 var $belongsTo = array(
  'Show'
 ); 
}

Это может не сработать, но я сталкивался с подобными проблемами раньше, и это решило его.Удачи.

0 голосов
/ 30 января 2011

Что произойдет, если вы запросите Показать таким же образом?

Вы уверены, что поля id определены правильно?

В обеих таблицах должно быть id (INTsize), а в эпизодах также должно быть show_id (INTsize).

Если он настроен в соответствии с соглашением Cake, вы сможете удалить строку 'foreignKey' => 'show_id', и Cake сам разберется с ней.

...