Yii определение наличия связанных моделей

Я хочу запустить запрос findAll, который возвращает только записи, для которых не существует связанной записи.

Кто-нибудь может сказать мне, как это делается в Yii?

Немного контекста на случай, если это поможет -

Я работаю над приложением для опроса, объекты, с которыми я работаю, -

ВопросОтвет на опросВопрос

SurveyQuestion HAS_MANY Ответили на вопрос

Поэтому я хочу вернуть модели QuestionSurvey, для которых не существует связанного с ним ответа на вопрос.

Заранее спасибо,

Ник


person goose    schedule 03.11.2012    source источник


Ответы (1)


Если вы SurveyQuestion::model()->with('AnsweredQuestion')->findAll(), это произойдет автоматически. Потому что он соберет все записи вместе, соединенные знаком INNER JOIN (если вы не укажете иное), и поэтому не будет снимать какие-либо вопросы, если на них нет ответов.

...Думаю.

Обновление
Хорошо, судя по вашим комментариям, я понял, что это у меня в голове. Вы действительно хотите просмотреть все SurveyQuestions, где AnsweredQuestions не существует для этого. В этом случае вы хотите, чтобы Yii выполнил LEFT JOIN, который вытащит NULL-запись для объединенной таблицы, если строка не существует. Затем вам нужно добавить условие в отношение, в котором указано, где AnsweredQuestion.id is NULL (или независимо от вашего первичного ключа, на самом деле может быть любое поле, но первичный ключ - хорошая практика).

Если это единичный случай, а не более постоянные отношения, вы можете:

SurveyQuestion::model()->with(array(
    'AnsweredQuestion'=>array(
        'joinType'=>'LEFT JOIN', 
        'condition'=>'`AnsweredQuestion`.`id` is NULL')
    )->findAll();
person Paystey    schedule 03.11.2012
comment
Я не совсем это имел в виду. Модель «Ответ на вопрос» предназначена для указания того, на какие вопросы уже даны ответы. Поэтому, если есть связанная запись, я не хочу включать родительскую запись. Я думаю, что это обратное тому, что вы говорите. Знаете ли вы, как отменить то, что Yii делает естественным образом? - person goose; 03.11.2012
comment
Не совсем. Ответы на вопросы не содержат ответов, он просто перечисляет то, на что уже были даны ответы. Я хочу получить список вопросов SurveyQuestion, не связанных с ответами на них. Это возможно? - person goose; 03.11.2012
comment
Спасибо за вашу помощь, это то, что я искал. Возникает еще один вопрос о возвращении только записей, относящихся к пользователю, на случай, если вам интересно - stackoverflow.com/questions/13211257/ - person goose; 03.11.2012
comment
Согласно документам with по умолчанию LEFT OUTER JOIN, все записи с / или без отношения соберется! - person Arth; 13.12.2013