Como filtrar campos en Gridview con tablas relacionadas con 3 saltos

Como filtrar campos en Gridview con tablas relacionadas con 3 saltos.



Escenario:

Tienes varias tablas relacionadas y no sabes como filtrar por texto esos campos que están en otras tablas, utilizando un modelo "Search".


Imagen de Vista de Gridview


En éste caso la solución es utilizar el modelo Search que puede ser generado automáticamente por gii de Yii2, una vez que tienes el archivo puede modificarlo para obtener los resultados deseados. En éste ejemplo se está realizando con una relación entre 3 tablas.

El resultado será que podremos consultar mediante un cuadro de texto buscando en el contenido de una tabla que es diferente a la del modelo del grid.

El primer paso será decidir cuales serán los campos que están en las otras tablas ya que necesitaremos hacer lo siguiente:

Paso #1.

Agrega parámetros públicos de tus variables de los cuales deseas realizar la búsqueda, puedes agregar cuantas relaciones tengas con otras tablas, el único requisito es que exista una relación de modelo entre las tablas que vas a utilizar.

public $username;


Paso #2.

Agregar los saltos o joins a las tablas que se desea relaciónar, recuerda que debes usar los nombres de relación que están declarados dentro del modelo de la tabla principal, por ejemplo en este caso mi tabla principal es "DispositivoLogin" por lo que debo de buscar el nombre de la relación que está declarada en el modelo que en mi caso se llama "accessToken".


 public function search($params)

    {

        $query = DispositivoLogin::find()
                 ->joinWith(['accessToken'])
                 ->joinWith(['accessToken.usuario']);

Observa que para el tercer salto, estoy utilizando una combinación entre 2 nombres de relación;  "->joinWith(['accessToken.usuario']);"


Paso #3.

En la sección del método rules, agregar el mismo nombre del método público.



public function rules()

    {

        return [

            [['id', 'access_token_id'], 'integer'],

            [['fecha_login' , 'username'], 'safe'],

        ];

    }


Paso #4.

Agregar en la sección de filtros el where como el siguiente ejemplo:


$query->andFilterWhere(['like', 'usuario.username', $this->username]);

En este caso como se observa se escribe el nombre del salto y como segundo parámetro el nombre del método público de la clase search.


Paso #5.

Para que se pueda mostrar el campo en la tabla "Gridview" deberás de agregar el campo de la siguiente manera.



        'columns' => [

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

            'id',

            [

                'attribute' => 'username',

                'value' => 'accessToken.usuario.username'

            ],
          .......
       ]


Paso #6

Si deseas agregar más campos puedes agregar más parámetros y repetir el proceso de la misma manera cómo lo menciona desde el paso #1.


Gracias por dejar tus comentarios.

Fuente: http://www.yiiframework.com/wiki/653/displaying-sorting-and-filtering-model-relations-on-a-gridview/


Comentarios

  1. Gracias por el tutorial, me gustaría saber ahora como puedo agregar el sort para esos nuevos campos del gridView.

    ResponderEliminar
    Respuestas
    1. Normalmente cuando ponemos un filtro se des habilita la opción de ordenar el campo, es algo que aun no he logrado, pero voy a volver a investigar a ver si es posible tener ambas opciones, gracias por dejar tu comentario.

      Eliminar

Publicar un comentario

Aprende Yii2


Lo más Visto

Cómo instalar RBAC

Select dependientes en cascada

Tutorial de implementación de calendario de rango de fechas con Karkit en gridView

Cómo enviar correos con Yii2

Creación de PDF con kartik\mpdf\Pdf

hostinger

ventana bienvenida