Построение условного оператора для нескольких моделей (CakePHP 1.2.5)

StackOverflow https://stackoverflow.com/questions/1632861

Вопрос

Допустим, у меня есть 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 запроса:

<Ол>
  • Во-первых, он выбирает идентификаторы для всех стран с кодом "США".
  • Затем он использует эти идентификаторы, чтобы ВЫБРАТЬ всех пользователей, ПРИСОЕДИНЯЮЩИХСЯ к регионам, где region.country_id находится в этом списке ранее идентифицированных идентификаторов страны.
  • В результате в моем приложении возникают ошибки SQL, поскольку мой массив condition содержит ссылку на Country.code, а второй запрос, который создает Cake, не объединяет страны.

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

    Это было полезно?

    Решение

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

    Другие советы

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top