2009-10-23 4 views
0

У меня возникла очень любопытная проблема. Я пытаюсь найти находку с условиями, которые работают во всех отношениях модели. До ...CakePHP find() не работает по моделям

$this->Model->find('first', array(
    'conditions' => array(
     'Model.col1' => 'value', 
     'RelatedModel.col2' => 'value2'))); 

... предполагая, что модель имеет отношение hasMany к RelatedModel. Это конкретные находят бомбы с следующим сообщением об ошибке:

Warning (512): SQL Error: 1054: Unknown column 'RelatedModel.col2' in 'where clause' [CORE/cake/libs/model/datasources/dbo_source.php, line 525]

Глядя на SELECT, делается, я быстро заметил, что сравнение в соответствующей модели, на самом деле быть помещенным в ИНЕКЕ, но по какой-то причине, единственное, что в предложении FROM было Model, без знака RelatedModel. Если я удалю сравнение, использующее взаимосвязь, соответствующие модели ARE вытащит результат.

Я использую торт 1.2.4. На первый взгляд, нет ничего в 1.2.4 -> 1.2.5 changelog, который, как я вижу, покрывает это, и вы думаете, что такая очевидная ошибка будет преследоваться и исправлена ​​несколькими днями позже, в отличие от ожидания полного месяц и не упоминать ничего в аннулировании выпуска.

Итак, что происходит?

ответ

2

Если ваши модели используют поведение Containable, убедитесь, что вы используете эти модели.

Во-первых, в вашем {MODEL_NAME} .php файл:

class {ModelName} extends AppModel { 
    var $actsAs = array('Containable'); 
} 

Затем в находке:

$results = $this->Model->find('first', array(
    'conditions' => array(
     'Model.col1' => 'value', 
     'RelatedModel.col2' => 'value2', 
    ), 
    'contain' => array('RelatedModel'), 
)); 

Если вы не используете Containable поведение, то попробуйте явно увеличивая уровень рекурсии:

$results = $this->Model->find('first', array(
    'conditions' => array(
     'Model.col1' => 'value', 
     'RelatedModel.col2' => 'value2', 
    ), 
    'recursive' => 1, 
)); 

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

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