Перебор CActiveDataProvider для получения значения из другой модели

0

В настоящее время я изучаю 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 для индекса?

Теги:
yii

1 ответ

0
Лучший ответ

Вы должны использовать отношения 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',
        ),
    ),
));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню