Yii Framework Forum: [Solucionado] Duda con Dataprovider - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

[Solucionado] Duda con Dataprovider Rate Topic: -----

#1 User is offline   daniqh 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 27
  • Joined: 25-March 13

Posted 06 September 2015 - 11:08 PM

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?
0

#2 User is offline   gifrancohe 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 99
  • Joined: 26-January 15

Posted 09 September 2015 - 02:37 PM

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.
0

#3 User is offline   daniqh 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 27
  • Joined: 25-March 13

Posted 09 September 2015 - 05:28 PM

View Postgifrancohe, on 09 September 2015 - 02:37 PM, said:

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',
                ]]);

                ?>

Attached File(s)

  • Attached File  ej.jpg (194.12K)
    Number of downloads: 9

0

#4 User is offline   gifrancohe 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 99
  • Joined: 26-January 15

Posted 10 September 2015 - 04:06 PM

Hola daniqh.


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

Saludos.
0

#5 User is offline   JoAnCa 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 2
  • Joined: 08-September 17

Posted 06 December 2017 - 12:39 PM

Quote

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?


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
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users