Yii cdbcriteria выбор столбцов отношения

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

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

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

ошибка:

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

3 ответов


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

что select делает, это выбирает его из базы данных и сопоставляет его с моделью переменная..

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

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

и если вы хотите вызвать имя пользователя как часть модели post только u должны объявить его как свойство в model, а затем указать псевдоним в 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;

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


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

$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());

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

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

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

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