2015-07-02 2 views
0

Я хочу спросить вас об использовании DetailView Виджет. Я хочу, чтобы показать данные присоединиться к таблице, поэтому я модифицировал функцию findModel($id) так:Yii2: Возвращаемое значение модели NULL (не установлено) при использовании Виджета Подробно VIew

protected function findModel($id) 
{ 
    if (($model = TPQ::findOne($id)) !== null) { 
     $data = $model::findBySql("SELECT * FROM tpq, kurikulum, pengurus where tpq.kurikulum_id = kurikulum.kurikulum_id and tpq.pengurus_id = pengurus.pengurus_id and tpq_id = $id")->all(); 
     return $data; 
    } else { 
     throw new NotFoundHttpException('The requested page does not exist.'); 
    } 
} 

Я использую функцию View

public function actionView($id) 
    { 
     return $this->render('view', [ 
      'model' => $this->findModel($id), 
     ]); 
    } 

Мой Вид:

<?= DetailView::widget([ 
    'model' => $model, 
    'attributes' => [ 
     'TPQ_ID', 
     'TPQ_NAMA', 
     'TPQ_ALAMAT', 
     'TPQ_KOORDINAT', 
     'TPQ_BERDIRI', 
     'TPQ_AKTIF', 
     'KURIKULUM_NAMA', 
     'KURIKULUM_DETAIL:ntext', 
     'KURIKULUM_AKTIF', 
     'PENGURUS_NAMA', 
     'PENGURUS_ALAMAT', 
     'PENGURUS_NOHP', 
    ], 
]) ?> 

полей в таблице TPQ: 'TPQ_ID', 'KURIKULUM_ID', 'PENGURUS_ID', 'TPQ_NAMA', 'TPQ_ALAMAT', 'TPQ_KOORDINAT', 'TPQ_BERDIRI', 'TPQ_AKTIF'

Поля в таблице Pengurus: 'PENGURUS_ID','USER_ID','PENGURUS_NAMA','PENGURUS_ALAMAT','PENGURUS_NOHP'

Поля в таблице Kurikulum: 'KURIKULUM_ID', 'KURIKULUM_NAMA', 'KURIKULUM_DETAIL', 'KURIKULUM_AKTIF'

Там нет ошибки, но она показывает 'не установлен' значение. Как я это исправим?

ответ

4

Есть некоторые проблемы с вашим кодом.

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

2) Лучше заменить findBySql() на методы ActiveQuery. Почему ActiveRecord необходим, если вы не используете его функции? Я не вижу сложной логики в вашем запросе, и даже сложная логика может быть построена с помощью ActiveQuery.

3) Для нескольких таблиц вам нужно указать отношения или отобразить несколько виджетов DetailView. Этот виджет предназначен для работы с одной моделью.

4) Для отображения отношений вы можете использовать точечные обозначения или геттеры.

Пример с точечной нотации:

'relation.attributeName', 

Пример с геттер:

[ 
    'attribute' => 'attributeName', 
    'value' => $model->relation->attributeName, 
], 

Read официальные документы для более подробной информации.