CakePHP find () не работает в разных моделях - PullRequest
0 голосов
/ 23 октября 2009

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

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

... при условии, что Model имеет отношение 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, я быстро заметил, что сравнение в связанной модели фактически помещается в предложение WHERE, но по какой-то причине единственное, что было в предложении FROM, было Model, без признаков RelatedModel , Если я удалю сравнение, использующее взаимосвязь, в результате будут получены связанные модели.

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

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

1 Ответ

2 голосов
/ 25 октября 2009

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

Сначала в файле {имя_модели} .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'),
));

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

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

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

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