Выборка определенных полей в AR

Здравствуйте. Вопрос у меня такой вопрос:

Есть 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, то все возвращает как надо, но результат будет содержать много избыточной информации (все поля мне не нужны).




	public function actionList()

	{

		$criteria=new CDbCriteria;

		$Options = array();

$Options['Articles']['select'] = array('articleTitle');

$Options['Users']['select'] = array('userName');

		$Articles=Articles::model()->with($Options)->findAll($criteria);

		

		$this->render('list',array(

			'Articles'=>$Articles,

		));

		

	}



не уверен, но вроде так

а стоп, не так - вот так :)




	public function actionList()

	{

		$criteria=new CDbCriteria;

$criteria->select='articleTitle';

		$Options = array();

$Options['Users']['select'] = array('userName');

		$Articles=Articles::model()->with($Options)->findAll($criteria);

		

		$this->render('list',array(

			'Articles'=>$Articles,

		));

		

	}



Не пробоваля я так извращаться над актив рекордом конечно, но есть предположение что это принуипиально невозможно, потому что в строке


$Articles=Articles::model()->with($Options)->findAll($criteria);

ты хочешь создать массив экземпляров типа Articles. А ведь Articles - это отображение таблицы Articles, в которой 100% нет поля userName. Отсюда может быть ошибка.

Когда ты работашь с актив рекордом, то та фактически работаешь с ОДНОЙ таблицей, потому что иначе возможно только чтение из БД.

А для данного случая тебе актив рекорд нафиг не нужен.

Ты просто должен сделать обычный запрос, которые вернет тебе два поля.

Но если все же очень хочется задействовать актив рекорд, то надо когда ты делаешь with() указать что тебе нужна табица Users и что из этой таблицы тебе нужно только одно поле - userName.

А в


$options->select = 'articleId';

Здесь нужны только поля статьи. С полями юзера ты разбираешься при указании параметров к with().

Вариант от duke1999 сработал, с оговоркой, что в $Options включается не Users (название таблицы), а название релейшена articleUser. Так что Мега респект!

З.Ы. понимаю, что проще и может чище было бы создать запрос, но хотелось через AR.

Еще вопросик примерно из той же оперы:

как можно сделать примерно такое (код тот же что выше с релейшеном на Users, но добавлены ф-и MySQL и возвращаем алиасом результат):


$criteria->select="articleTitle, DATE_FORMAT(Articles.articleDate,'%d.%m.%Y') AS articleDate";

Форматирование даты — просто частный пример. Возможно ли так же впихнуть другие ф-ции (IF,CASE и т.д.)?

Неужели решения нет? Никто не сталкивался с такими проблемами?

А в чем проблема?

Проблема в том, как сделать такое:


$criteria->select="articleTitle, DATE_FORMAT(Articles.articleDate,'%d.%m.%Y') AS articleDate";

Т.е. засунуть в SELECT это конструкцию «DATE_FORMAT(Articles.articleDate,’%d.%m.%Y’) AS articleDate»