Есть 2 модели Articles и Users. Релейшн в моделе Articles: ‘articleUser’ => array(self::BELONGS_TO, ‘Users’, ‘articleUserId’)
Делаю выборку списка статей (метод actionList).
public function actionList()
{
$criteria=new CDbCriteria;
$criteria->select='Articles.articleTitle, Users.userName';
$Articles=Articles::model()->with('articleUser')->findAll($criteria);
$this->render('list',array(
'Articles'=>$Articles,
));
}
В итоге не работает! Говорит Active record "Articles" is trying to select an invalid column "Users.userName"
Т.е. как я понимаю, у нее свои алиасы таблиц и Users.userName она воспринимает как название поля в таблице Articles. Названия всех полей уникальны (без алиасов тот же эффект).
Собственно вопрос: как можно выбрать только ОПРЕДЕЛЕННЫЕ поля из нескольких связанных таблиц?
З.Ы.: если убрать $criteria->select, то все возвращает как надо, но результат будет содержать много избыточной информации (все поля мне не нужны).
ты хочешь создать массив экземпляров типа Articles. А ведь Articles - это отображение таблицы Articles, в которой 100% нет поля userName. Отсюда может быть ошибка.
Когда ты работашь с актив рекордом, то та фактически работаешь с ОДНОЙ таблицей, потому что иначе возможно только чтение из БД.
А для данного случая тебе актив рекорд нафиг не нужен.
Ты просто должен сделать обычный запрос, которые вернет тебе два поля.
Но если все же очень хочется задействовать актив рекорд, то надо когда ты делаешь with() указать что тебе нужна табица Users и что из этой таблицы тебе нужно только одно поле - userName.
А в
$options->select = 'articleId';
Здесь нужны только поля статьи. С полями юзера ты разбираешься при указании параметров к with().
Вариант от duke1999 сработал, с оговоркой, что в $Options включается не Users (название таблицы), а название релейшена articleUser. Так что Мега респект!
З.Ы. понимаю, что проще и может чище было бы создать запрос, но хотелось через AR.