[Solucionado] Duda con Dataprovider

Buenas, he creado una vista ampliada en donde puedo consultar información sobre la matricula de un alumno concreto.

En esta vista, he puesto un gridview con los registros de otro modelo llamado pagos. En este grid, cargo los pagos que ha realizado un alumno en el curso actual.

He creado un sqldataprovider y se lo paso a la vista matriculas/view con el alumno_id y curso_id.

Controller Matriculas


  public function actionView($alumno_id, $curso_id)

    {

        $count = Yii::$app->db->createCommand('SELECT COUNT(*) FROM pagos WHERE persona=:persona AND curso=:curso_id', [':persona' => $alumno_id,':curso_id'=>$curso_id])->queryScalar();

        $dataProvider = new SqlDataProvider([

            'sql' => 'SELECT * FROM pagos WHERE persona=:persona AND curso=:curso_id',

            'params' =>[':persona' => $alumno_id,':curso_id'=>$curso_id],

            'totalCount' => $count,

            'sort' => [

                'attributes' => [

                    'id'

                ],

            ],

            'pagination' => [

                'pageSize' => 20,

            ],

            ]);

        

        return $this->render('view', [

            'model' => $this->findModel($alumno_id, $curso_id),'pagos'=>$dataProvider

        ]);

    }

Ahora en la vista matriculas/view inicializo el grid de esta manera:


<?php

echo GridView::widget([

                    'dataProvider' => $pagos,

                    'columns' => [

                        ['class' => 'yii\grid\SerialColumn'],

                        'concepto',

                        'importe',

                        'forma_pago',

                        'notas',

                ]]);


                ?>

Mi duda es la siguiente, como podreís observar tengo un campo en la tabla pagos que se llama ‘forma_pago’, este campo es una FK de la tabla fpagos. He estado intentando mostrar el nombre de la forma de pago, en vez de la FK para ello, he ido al modelo pagos y he buscado la relación.


//Modelo Pagos

 public function getFormaPago()

    {

        return $this->hasOne(Fpago::className(), ['id' => 'forma_pago']);

    }

he probado a poner ‘FormaPago.nombre’ en el grid pero no muestra nada.

¿Alguna idea?

Hola daniqh.

Lo que debes hacer es crear la relación entre los modelos pago y forma_pago, y de esta forma podrias colocar el nombre de la forma de pago.

Ejemplo de una relación entre modelos:




 public function relations()

 {

     // NOTE: you may need to adjust the relation name and the related

     // class name for the relations automatically generated below.

     return array(

	'formaPago' => array(self::BELONGS_TO, 'FormaPago', 'FKForma_Pago'), //Donde FormaPago es el nombre de tu modelo y FKForma_pago es la llave primaria de este modelo o el campo por el cual quieras hacer la relación

     );

 }




Y ahora en tu GridView puedes usarlo de esta forma:




     'concepto',

     'importe',

      array(

	'name'=>'forma_pago',

	'value'=>'$dataProvider->formaPago->nombrePago',

      ),

     'notas',



Asi seria la utilización de la relación.

Saludos.

Buenas,muchas gracias por responder pero, lo que me has comentado es la manera correcta de establecer relaciones en YII 1 y actualmente estoy usando YII 2, fallo mío por no especificarlo en título del post.

Para crear una relación en YII2 bastaría con poner lo siguiente:




// En el modelo Pago, establezco una relación entre el campo forma_pago y el atributo id de la tabla Fpago(Formas de pago)

 public function getFormaPago()

    {

        return $this->hasOne(Fpago::className(), ['id' => 'forma_pago']);

    }



Mi problema es que, quiero mostrar un grid de los pagos de un alumno concreto en las vista "view" del modelo matriculas.

Este modelo no tiene ninguna relación con la tabla pagos. Por eso, para cargar el grid obtengo los datos de la tabla pagos mediante un SqlDataProvider y se lo mando a la vista "matriculas/view".

Solución Provisional:

Pues como dice la frase "si la montaña no va a Mahoma, Mahoma va a la montaña".

Así que he obtado por cambiar la consulta SQL,añadir la tabla fpagos y selecionar el campo nombre.

Controlador Matriculas:





public function actionView($alumno_id, $curso_id)

    {

        $count = Yii::$app->db->createCommand('SELECT COUNT(*) FROM pagos WHERE persona=:persona AND curso=:curso_id', [':persona' => $alumno_id,':curso_id'=>$curso_id])->queryScalar();

        $dataProvider = new SqlDataProvider([

            'sql'=>'SELECT pagos.id,pagos.persona,pagos.curso,pagos.importe,pagos.concepto,pagos.forma_pago,fpago.nombre,pagos.fecha_cobro,pagos.notas FROM pagos,fpago WHERE (persona=:persona AND curso=:curso_id) AND (forma_pago=fpago.id) ',

            //'sql' => 'SELECT * FROM pagos WHERE persona=:persona AND curso=:curso_id',


            'params' =>[':persona' => $alumno_id,':curso_id'=>$curso_id],

            'totalCount' => $count,

            'sort' => [

                'attributes' => [

                    'id'

                ],

            ],

            'pagination' => [

                'pageSize' => 20,

            ],

            ]);


        return $this->render('view', [

            'model' => $this->findModel($alumno_id, $curso_id),'pagos'=>$dataProvider

        ]);

    }

Y para cargar el gridview en la vista matriculas/view:


    

<?php 

echo GridView::widget([

                    'dataProvider' => $pagos,

                    'columns' => [

                        ['class' => 'yii\grid\SerialColumn'],

                        'concepto',

                        'importe',

                        //'forma_pago',

                        [

                            'label'=>'Forma de pago',

                            'value'=>'nombre',

                        ],

                        'notas',

                ]]);


                ?>

Hola daniqh.

que bueno que lo pudiste solucionar, y disculpa por no haberme fijado que estas trabajando con Yii 2.0

Saludos.

Se que el post es bastante antiguo, y esta dado por solucionado, pero igual quisiera aportar mi solución

Pues como lo planteas esta bien, solo que el nombre de la relacion tiene que comenzar con minúscula, lo correcto sería:

‘formaPago.nombre’ con inicial minuscula