У меня очень трудное время, чтобы выбрать имена пользователей всех сообщений в демо-версии блога, приведенных в Yii ..
автор – отношение класса post с пользователем …
$criteria = new CDbCriteria; $criteria->with='author'; $criteria->select='author.username'; $dataProvider=new CActiveDataProvider('Post', array( 'criteria' => $criteria, )); var_dump($dataProvider->getData());
Ошибка:
Активная запись «Почта» пытается выбрать недопустимый столбец «author.username». Обратите внимание: столбец должен существовать в таблице или быть выражением с псевдонимом.
то, что делает, – это
eager loading
означает, что данные отношения будут также загружаться из базы данных вместе, а когда когда вы вызовете это отношение, фактического запроса не будет.Какой выбор делает он, он выбирает его из базы данных и сопоставляет его с переменной модели.
Теперь в вашем случае, что вы делаете, вы пытаетесь написать столбец некоторого отношения в select, который будет присутствовать в select даже без его записи, но поскольку нет соответствующей переменной для сопоставления этого значения, yii выдает ошибку.
Итак, прежде всего, если вам нужно ввести имя пользователя в ответ, вы можете получить его по вызову отношения, который не будет вызовом базы данных, и вам не нужно писать выбор.
И если вы хотите назвать имя пользователя как часть модели сообщений, вам нужно объявить его как свойство в модели, а затем указать псевдоним в 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
Чтобы настроить параметры «на лету», мы должны передать параметр массива методу with (). Ключи массива – это имена отношений, а значения массива – соответствующие параметры запроса.