Yii cdbcriteria выбрать столбцы отношения - PullRequest
7 голосов
/ 19 февраля 2012

Мне очень трудно выбрать имена пользователей всех постов в демо-записи блога, приведенной в Yii ..

автор - это отношение класса сообщения к пользователю ...

$criteria = new CDbCriteria;
$criteria->with='author';
$criteria->select='author.username';
$dataProvider=new CActiveDataProvider('Post', array(
    'criteria' => $criteria,
));
var_dump($dataProvider->getData());

Ошибка:

Активная запись "Post" пытается выбрать неверный столбец "author.username". Обратите внимание, что столбец должен существовать в таблице или быть выражением с псевдонимом.

Ответы [ 3 ]

8 голосов
/ 21 июля 2012

то, что делает with, это eager loading .. это означает, что данные отношения также будут загружены из базы данных вместе с ним, и когда вы вызовете отношение, реальный запрос не будет ..

Что делает select, это выбирает его из базы данных и отображает его в переменную модели.

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

Итак, во-первых, если вам нужно имя пользователяВ ответ на запрос auther, вы можете получить его с помощью вызова отношений, который не будет вызовом базы данных, и вам не нужно писать select.

И если вы хотите вызвать имя пользователя как частьтолько модель поста вы должны объявить его как свойство в модели, а затем указать псевдоним в select ..

$criteria = new CDbCriteria;
$criteria->with='author';
$criteria->select='author.username as auther_username';
$dataProvider=new CActiveDataProvider('Post', array(
    'criteria' => $criteria,
));
var_dump($dataProvider->getData());

и в вашей модели Post объявить ..

public $auther_username;

Теперь не будетw ошибка, и вы можете получить доступ к имени пользователя обоими способами .. $post->auther_username и $post->auther->username

1 голос
/ 11 сентября 2013

Попробуйте это:

$criteria = new CDbCriteria;
$criteria->with=array('author'=>array('select'=>'username'));
$dataProvider=new CActiveDataProvider('Post', array(
    'criteria' => $criteria,
));
var_dump($dataProvider->getData());

Источник: CActiveRecord.with

Чтобы настроить параметры на лету, мы должны передать массивпараметр для метода with ().Ключи массива - это имена отношений, а значения массива - соответствующие параметры запроса.

1 голос
/ 20 февраля 2012

Попробуйте это:

$criteria = new CDbCriteria;
$criteria->with=array('author'=>array('select'=>'username'));

// you can still select Post table columns here
$criteria->select='post_content';

$dataProvider=new CActiveDataProvider('Post', array(
   'criteria' => $criteria,
));
var_dump($dataProvider->getData());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...