2012-02-19 3 views
6

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

автор отношение пост класса с пользователем ...

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

Ошибка:

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

ответ

8

what with does is eager loading ..that means the relation's data will also loaded from database alongwith, and when when u'll call the relation, there won't be a actual query..

What select does is it selects it from database and maps it to model variable..

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

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

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

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

and in your Post model declare..

public $auther_username; 

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

+0

Я не обвиняю, но если вы занижены, пожалуйста, объясните почему? потому что я не вижу ничего плохого в своем методе (ни в вашем). –

+0

, так что, похоже, это то, что искали, искали, +1 –

+0

Он работает. Спасибо большое . –

1

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

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

Нах dude..thats не в way..Its же .. – user1135655

+0

же, как и в? критерии работают наверняка. сообщите мне, какая строка кода дает вам тот же результат. –

+0

кто-то поддержал несколько дней назад! затем кто-то запустил несколько часов назад! поэтому downvoter, если вы прочтете это, объясните причину, потому что в моем коде и в моем методе нет ничего плохого. возможно, я смогу улучшить ответ, если потребуется. конструктивная критика всегда приветствуется –

1

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

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

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

In order to customize the options on the fly, we should pass an array parameter to the with() method. The array keys are relation names, and the array values are the corresponding query options.

Смежные вопросы