Построение условного оператора для нескольких моделей (CakePHP 1.2.5) - PullRequest
0 голосов
/ 27 октября 2009

Допустим, у меня есть 3 модели: пользователь, регион, страна.

User belongsTo Region
Region belongsTo Country

Каждая из этих моделей использует поведение Containable. Я пытаюсь найти пользователей из страны с кодом «США». Вот что я пытаюсь:

$users = $this->User->find('all', array(
    'conditions' => array('Country.code' => 'US'),
    'contain'    => array('Region.Country'),
));

CakePHP разделяет это на 2 запроса:

  1. Во-первых, это ВЫБОР идентификаторов для всех стран с кодом «США».
  2. Затем он использует эти идентификаторы, чтобы ВЫБЕРИТЬ всех пользователей, ПРИСОЕДИНЯЮЩИХСЯ к регионам, где region.country_id находится в этом списке ранее идентифицированных идентификаторов страны.

В результате в моем приложении возникают ошибки SQL, поскольку мой массив conditions содержит ссылку на Country.code, а второй запрос, который создает Cake, не объединяет страны.

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

Ответы [ 2 ]

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

Нейт Абеле (бывший ведущий разработчик CakePHP) написал статью о специальных соединениях , которые могут помочь.

1 голос
/ 29 октября 2009

Положите условия в контейнере. Например:

$users = $this->User->find('all', array('contain' => array(
    'Region' => array(
        'Country' => array(
            'conditions' => array('Country.code' => 'US'),
        ),
    ),
)));

См. Предпоследний пример в Содержимое руководства

...