2011-04-13 14 views
7

Mam model ze skojarzeniem has_many.Korzystanie z CGridView dla powiązania modelu

Powiedzmy, że Student ma wiele kursów.

Chciałbym pokazać wszystkie kursy danego ucznia za pomocą CGridView.

coś takiego:

$this->widget('zii.widgets.grid.CGridView', array(             
    'dataProvider' => $model->courses,                
    'columns'=>array(                                           
    'name',                                             
),                         
)); 

próbował także new CActiveDataProvider($model->courses) jako dataProvider ale nadal nie będzie działać.

Czy istnieje prosty sposób na zrobienie tego? Czy muszę utworzyć kryteria wyszukiwania w modelu Kursu z pewnymi kryteriami zaczerpniętymi z modelu ucznia ręcznie?

Odpowiedz

13
  1. Pozbądź nawiasie po kursach

  2. użyć arraydataprovider

    $this->widget('zii.widgets.grid.CGridView', array(
        'dataProvider' => new CArrayDataProvider($model->courses, array()), 
        'columns'=>array(
        'name', 
    ), 
    )); 
    
+0

To działa! Dzięki! – Engwan

0

Kilka rzeczy, aby rozpocząć:

  1. myślę, że powinno być $model->courses zamiast $model->courses()
  2. Dlatego, że nie działa w każdym razie to, że stosunki AR Yii zwraca tablicę obiektów, a nie Faktyczny obiekt DataProvider

W każdym razie wydaje mi się, że pamiętam, że również walczyłem z tym. Nigdy tak naprawdę nie działałem tak, jakbym tego chciała. Najbliższe było ustawienie zmiennej "data" w moim dataProvider, ale wtedy stronicowanie zostało zerwane w moim ListView. To zadziałało coś takiego:

$dataProvider=new CActiveDataProvider('Course', array(
    'data'=>$model->courses, 
)); 

Co skończyło się robi było stworzenie nowych kryteriów przejść do mojego DataProvider że zrobił to samo, co w relacji. Podobnie jak:

$criteria=new CDbCriteria; 
$criteria->join = "JOIN student_course_relation_table sc ON sc.course_id = t.id"; 
$criteria->compare('sc.student_id',$model->id); 
$dataProvider=new CActiveDataProvider('Course', array(
    'criteria'=>$model->courses, 
)); 

Przyjmuję, że używasz relacji MANY_MANY ze stołem sprzężenia. Mam nadzieję, że to pomoże, mimo że jestem pewien, że nie jest to coś, co chcesz robić. Jeśli ktokolwiek ma lepsze rozwiązanie, podziel się nim! Chcę się o tym dowiedzieć! :)

Powiązane problemy