2012-04-11 3 views
3

Я заранее извиняюсь, если на этот вопрос был дан ответ в другом месте; Я искал высокий и низкий для существующего ответа, но вышел пустым. Возможно, я ищу неправильные ключевые слова.CakePHP принадлежит нескольким моделям?

У меня есть три модели, два (студент и наставник) которых имеют отношение $hasMany к общей модели (Назначение), которая имеет отношения $belongsTo с обеими другими моделями. Точные модели ниже ...

Студент hasMany НАЗНАЧЕНИЯ ...

class Student extends AppModel { 
    var $hasMany = array (
     'Appointment' => array (
      'foreignKey' => 'student_id' 
     ) 
    ); 

репетитором hasMany НАЗНАЧЕНИЯ ...

class Tutor extends AppModel { 
    var $hasMany = array (
     'Appointment' => array (
      "foreignKey" => 'tutor_id' 
     ) 
    ); 

встречу belongsTo Студента и самостоятельно ...

class Appointment extends AppModel { 
    var $belongsTo = array (
     'Student' => array (
      'foreignKey' => 'student_id' 
     ), 
     'Tutor' => array (
      'foreignKey' => 'tutor_id' 
     ) 
    ); 

при взгляде на запись студента (например, «приложение/студент/вид/4») Мне нужно, чтобы иметь возможность перечислить даты их предстоящих назначений и имя репетитора для этого назначения. Поэтому мне нужно получить доступ к данным из модели Tutor (имя), глядя на модель Student. Прямо сейчас я смог выполнить это, используя $this->Student->query(), чтобы вытащить связанные записи репетитора, но это приводит к повторению информации учащегося в полученном массиве.

Все отношения $hasMany и $belongsTo работают очень хорошо. Имеет ли CakePHP встроенную функцию, которую мне не хватает, чтобы получить связанную информацию, или это нужно сделать где-нибудь где-то?

+0

Попробуйте установить 'рекурсивная => 2' на вашем' find'. Это должно дать вам один дополнительный уровень связанных моделей. – bfavaretto

+0

Спасибо. Это работает, но является ли это масштабируемым решением? Запись студента повторяется для каждой встречи в возвращенном массиве. С 15 полями в этой таблице и 10+ назначений на одного учащегося, это 150 дополнительных полей в каждом запросе. –

+0

Я знаю, был там ... Альтернативы: (1) Контейнер, (2) [принудительное объединение] (http://bakery.cakephp.org/articles/nate/2009/01/21/quick-tip-doing -ad-hoc-joins-in-model-find) или (3) запись запроса вручную. – bfavaretto

ответ

3

Вы должны рассмотреть возможность использования Containable. Если вы не знакомы с этим, это Behavior, который вы можете прикрепить к моделям и использовать для определения того, какие связанные модели должны быть включены в find, так как многие модели и настолько глубоки, насколько вам нравится.

Я всегда использую его для всех моделей, установив его в AppModel:

var $actsAs = array('Containable'); 

Тогда в контроллере:

$this->Student->find('first', array(
    'conditions' => ..., 
    'contain' => array('Appointment' => 'Tutor'), 
    ... 
)); 
+0

Спасибо. Мне нужно больше узнать о Containables. Я возился с ним в прошлом, но никогда не работал на 100%. –

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

  • Нет связанных вопросов^_^