2012-02-09 3 views
1

У меня возникли некоторые проблемы с пониманием того, как CakePHP делает свою связь. Рассмотрим следующую конфигурацию базы данных:Проблемы ассоциации CakePHP

enter image description here

Я делаю отношения в коде CakePHP, как это:

AbstractComponent

<?php 
App::uses('AppModel', 'Model'); 
/** 
* AbstractComponent Model 
* 
*/ 
class AbstractComponent extends AppModel { 
/** 
* Display field 
* 
* @var string 
*/ 
    public $displayField = 'id'; 

    public $hasOne = array(
     'DetailComponent' => array(
      'className' => 'DetailComponent', 
      'foreignKey' => 'component_id' 
     ) 
    ); 

    public $hasMany = array(
     'TargetComponent' => array(
      'className' => 'ListComponent', 
      'foreignKey' => 'target_component_id' 
     ), 
     'ListComponent' => array(
      'className' => 'ListComponent', 
      'foreignKey' => 'component_id' 
     ) 
    ); 

} 

ListComponent

<?php 
App::uses('AppModel', 'Model'); 
/** 
* ListComponent Model 
* 
*/ 
class ListComponent extends AppModel { 
/** 
* Display field 
* 
* @var string 
*/ 
    public $displayField = 'id'; 

    public $belongsTo = array(
     'AbstractComponent' => array(
      'className' => 'AbstractComponent', 
      'foreignKey' => 'component_id' 
     ) 
    ); 

    public $hasOne = array(
     'TargetComponent' => array(
      'className' => 'TargetComponent', 
      'foreignKey' => 'list_component_id' 
     ) 
    ); 
} 

TargetC omponent

<?php 
App::uses('AppModel', 'Model'); 
/** 
* TargetComponent Model 
* 
*/ 
class TargetComponent extends AppModel { 
/** 
* Display field 
* 
* @var string 
*/ 
    public $displayField = 'id'; 

    public $belongsTo = array(
     'ListComponent' => array(
      'className' => 'ListComponent', 
      'foreignKey' => 'list_component_id' 
     ) 
    ); 
} 

DetailComponent

<?php 
App::uses('AppModel', 'Model'); 
/** 
* DetailComponent Model 
* 
*/ 
class DetailComponent extends AppModel { 
/** 
* Display field 
* 
* @var string 
*/ 
    public $displayField = 'title_label_text'; 

    public $belongsTo = array(
     'AbstractComponent' => array(
      'className' => 'AbstractComponent', 
      'foreignKey' => 'component_id' 
     ) 
    ); 
} 

Как получилось, что всякий раз, когда я получаю к моему Add зрения TargetComponents я не могу выбрать список компонентов? Как получить доступ к этим объектам? Все остальные отношения работают нормально, и я могу выбрать идентификатор, соответствующий записи в моей базе данных.

Это мой диспетчерская добавить функцию:

public function add() { 
     if ($this->request->is('post')) { 
      $this->TargetComponent->create(); 
      if ($this->TargetComponent->save($this->request->data)) { 
       $this->Session->setFlash(__('The target component has been saved')); 
       $this->redirect(array('action' => 'index')); 
      } else { 
       $this->Session->setFlash(__('The target component could not be saved. Please, try again.')); 
      } 
     } 

     $list_components = $this->TargetComponent->ListComponent->find('list'); 
     $this->set(compact('list_components')); 
    } 

и мое мнение:

<div class="targetComponents form"> 
<?php echo $this->Form->create('TargetComponent');?> 
    <fieldset> 
     <legend><?php echo __('Add Target Component'); ?></legend> 
    <?php 
     echo $this->Form->input('type'); 
     echo $this->Form->input('list_components_id'); 
    ?> 
    </fieldset> 
<?php echo $this->Form->end(__('Submit'));?> 
</div> 
<div class="actions"> 
    <h3><?php echo __('Actions'); ?></h3> 
    <ul> 

     <li><?php echo $this->Html->link(__('List Target Components'), array('action' => 'index'));?></li> 
    </ul> 
</div> 

Я застрял, и явно делает что-то ужасающе неправильно.

Помощь очень высоко ценится!

Заранее спасибо

-B

+1

+1 на вопрос о вашем большом внимании к деталям и в том числе EER вашего дизайна базы данных, больше людей должны научиться публиковать свои вопросы вот так! :) – Oldskool

+0

Большое вам спасибо за комплимент. Мне нравится быть в курсе моего кода и всех его периферийных устройств. Я также чувствую, что люди должны делать это чаще, учитывая тот факт, что это облегчает облегчение друг другу. – Craimasjien

ответ

3

Я проверил это на моем локальном окружении торт с некоторыми фиктивными значениями в базе данных (1 для Int полей и Test для VARCHAR полей). Оказывается, все на самом деле правильно связано, но проблема лежит в пределах взгляда.

По какой-то причине Cake не автоматически позиционирует значения в выпадающем списке list_components_id (в то время как по соглашению он должен разместить массив $list_components). Принуждение вариантов заставляет его работать на меня. Так, по мнению, заменить:

echo $this->Form->input('list_components_id'); 

с этим:

echo $this->Form->input('list_components_id', array('options' => $list_components)); 

Это делает трюк для меня и заселяет ниспадающее меню с идентификаторами из модели ListComponents.

+0

Спасибо за ваш ответ! Непонятно, почему CakePHP не «автоматически» находит привязки. – Craimasjien

+1

@ Bryan Да, я тоже не понимаю, почему. AFAIK, это поведение не изменилось в 2.0, поэтому не было ничего плохого в том, как вы думали в первую очередь :) – Oldskool

+0

Спасибо, что помогли мне решить эту проблему. Есть ли более простой способ общения? Думаю, я могу многому научиться у вас! – Craimasjien

Смежные вопросы