В настоящее время я изучаю Yii. Я пытаюсь перебрать результаты CActiveDataProvider и получить значение одного индекса из каждого результата и использовать его для вывода данных из другой модели. Я точно не знаю, правильно ли я это сделаю.
public function actionIndex()
{
// This next line works and return data, but I want it to index with each record in $dataProvder
// $name = Artist::model()->findByPk(1);
$name = Artist::model();
$dataProvider=new CActiveDataProvider('Album');
foreach($dataProvider->getData() as $record){
$name->findByPk($record->artist_Id);
$this->name[] = $name->firstName . " " . $name->lastName;
}
$this->render('index',array(
'dataProvider'=>$dataProvider,
'name' =>$this->name,
));
}
Что заставляет мои результаты быть пустыми, когда я использую dataProvider для индекса?
Вы должны использовать отношения Active Record для такой ситуации. Поставщики данных могут принимать во внимание отношения и объединять данные автоматически. Это жизненно важная концепция для обучения, чтобы эффективно использовать Active Record в Yii, поэтому я предлагаю читать и практиковать примеры. Здесь ссылка на официальное руководство:
http://www.yiiframework.com/doc/guide/1.1/en/database.arr
Для вашего конкретного случая отношения выглядят примерно так:
Функция класса альбома:
class Album extends CActiveRecord{
//beginning of model
public function relations(){
return array(
'artist' => array(self::BELONGS_TO, 'Artist', 'artist_Id'),
);
}
//rest of model
}
Функция отношения класса Artist:
class Artist extends CActiveRecord{
//beginning of model
public function relations(){
return array(
'albums' => array(self::HAS_MANY, 'Album', 'artist_Id'),
);
}
//rest of model
}
Действие контроллера:
public function actionIndex()
{
$names = array();
$dataProvider=new CActiveDataProvider('Album', array(
'criteria' => array(
'with' => 'artist',
)
));
foreach($dataProvider->getData() as $record){
$names[] = $record->artist->firstName . " " . $record->artist->lastName;
}
$this->render('index',array(
'dataProvider'=>$dataProvider,
'name' => $names,
));
}
Процитировав критерии для поставщика данных "Альбомы", говорящего о том, чтобы присоединиться к "художникам", все исполнители и альбомы будут загружены в 1 SQL-запросе. Вы можете получить доступ к информации о Artist от поставщика данных, например, в виде сетки в вашем файле вида:
$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$dataProvider,
'columns'=>array(
'name', // album name
'artist.firstName', // display the first name of the artist
array( // display the full name of the artist
'name'=>'fullName',
'value'=>'$data->artist->firstName." ".$data->artist->lastName',
),
),
));