Найти условия «НЕ СУЩЕСТВУЕТ» для отношений hasMany - PullRequest
3 голосов
/ 08 сентября 2011

Этот вопрос похож на Найдите условия типа «НЕ СУЩЕСТВУЕТ» , за исключением того, что он работает с отношением hasMany.

Таблицы:

вопросы id bigint ...

ответы id bigint вопрос_ид Bigint ...

Отношения это вопросы, у которых есть много ответов.

Запрос состоит в поиске идентификаторов вопросов, на которые нет ответов.

SQL может выглядеть как

select id from questions where not exists 
    (select * from answers where answers.question_id = questions.id)

Самый быстрый способ - просто запустить запрос () с оператором, но я хотел бы знать, есть ли способ CakePHP.

Я бы хотел избежать сценария NOT IN, поскольку это может привести к двум попаданиям в базу данных; Один для получения всех идентификаторов вопросов для вопросов, на которые есть ответы, а второй для получения всех идентификаторов вопросов для вопросов, на которые нет ответов.

Другим способом может быть помещение целого предложения where в массиве условий в виде одной записи. Я просто не уверен, что это лучшая практика.

Ответы [ 2 ]

8 голосов
/ 13 сентября 2011

Не изменяя базу данных, я использовал следующий запрос:

$questions = $this->Questions->find('all', array(
    'fields' => array('id'),
    'conditions' => array('not exists '.
        '(select id from answers '.
        'where answers.question_id = '.
        'Question.id)'
     )
));
3 голосов
/ 08 сентября 2011

Лучший способ сделать это - иметь поле подсчета в вашей таблице сообщений. Cake имеет встроенную функцию, которая называется счетчик кэша.

class Post extends AppModel
{
    var $name = "Post";
    var $hasMany = array('Answer'=>array('counterCache'=>true));
}

Вам нужно будет добавить answer_count в вашу таблицу сообщений. Этот столбец будет обновляться автоматически при добавлении и удалении связанных записей.

Тогда ваш запрос является простой находкой:

$this->Post->find('all', array('conditions' => array('answer_count' => 0)));

Документация найдена здесь: http://book.cakephp.org/view/1033/counterCache-Cache-your-count

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