Cómo filtrar mediante cadenas de consulta

Este tutorial se centrará en agregar la capacidad de filtrar por cadenas de consulta al obtener información de la base de datos. Hay algunas otras formas de realizar este tipo de filtrado, pero muchas veces una simple cadena de consulta es una buena forma de hacerlo. Comenzaremos ejecutando todas nuestras pruebas y arreglando cualquier problema que pudiera haber salido mal. Una vez que se solucione, podemos pasar a agregar una nueva función de prueba para admitir nuestra nueva función de filtrar hilos por cadena de consulta. Una vez que se configura la prueba, creamos la función, la probamos nuevamente y nos aseguramos de que todo esté listo. Configuremos ahora el filtrado por cadenas de consulta.

En nuestra aplicación, todavía no tenemos la capacidad de filtrar hilos por usuario. La función que nos gustaría agregar es poder hacer clic en el nombre de un usuario, y la aplicación filtrará y mostrará todos los hilos de ese usuario en la página. ¿Cómo podemos hacer esto? Intentaremos crear esta función mediante el filtrado mediante cadenas de consulta.


Comience ejecutando el conjunto de pruebas completo

En primer lugar, comenzaremos ejecutando nuestro conjunto de pruebas completo. Queremos asegurarnos de que todo siga funcionando y funcionando antes de seguir adelante.

vagabundo @ homestead: ~ / Código / forumio $ phpunit
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

EEEEEEEEEEEEEEEEEEEE 20/20 (100%)

Tiempo: 965 ms, memoria: 10,00 MB

Hubo 20 errores:

1) Pruebas \ Característica \ CreateThreadsTest :: test_guest_can_not_create_threads
Illuminate \ Database \ QueryException: SQLSTATE [HY000]: Error general: 1 no existe tal tabla: canales (SQL: seleccione * de "canales")

Oh wow. Tenemos el 100% de las pruebas fallando. Um, esto no es bueno. ¡No es bueno en absoluto! ¿Que pasó? Bueno, el error nos da una pista. No hay tales canales de mesa. Esto se debe a que cuando estábamos configurando el editor de vistas de nuestro último tutorial, la consulta SQL se ejecuta incluso antes de que se ejecuten las migraciones de la base de datos, por lo que necesitamos refactorizar un poco. En AppServiceProvider.php, cambie el código de esto:

volviendo a esto:

Ejecutamos nuestras pruebas nuevamente, y el 100% de las pruebas pasan.

vagabundo @ homestead: ~ / Código / forumio $ phpunit
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

.................... 20/20 (100%)

Tiempo: 2,94 segundos, memoria: 12,00 MB

OK (20 pruebas, 35 afirmaciones)

En lugar de usar la técnica share (), volvemos a usar composer () y esto permitirá arreglar el orden en que se ejecuta la consulta SQL, a su vez, arreglar las pruebas.


Agregar una nueva prueba de funciones a la clase ReadThreadsTest

Abramos la clase ReadThreadsTest y agreguemos una nueva prueba. ¿Qué queremos que haga la prueba? Así es como podría verse el pseudocódigo.

  • Dado que un usuario ha iniciado sesión
  • Ese usuario crea un hilo
  • Un usuario diferente crea un hilo
  • Cuando el primer usuario visita la página de hilos con su filtro de cadena de consulta
  • Entonces el primer usuario verá sus hilos.
  • Entonces el primer usuario no verá los hilos de otros usuarios

Pongamos eso en el código de prueba aquí:

El siguiente paso, como de costumbre, es ejecutar esa prueba para ver cuál es el error que produce.

vagabundo @ homestead: ~ / Code / forumio $ phpunit --filter test_a_user_can_filter_by_any_username
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

F 1/1 (100%)

Tiempo: 812 ms, memoria: 10,00 MB

Hubo 1 falla:

1) Tests \ Feature \ ReadThreadsTest :: test_a_user_can_filter_by_any_username
No se pudo afirmar que (el html) no contiene "Quia sunt tempore nostrum qui.".

/home/vagrant/Code/forumio/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:262
/home/vagrant/Code/forumio/tests/Feature/ReadThreadsTest.php:60

¡FALLOS!
Pruebas: 1, afirmaciones: 2, fallos: 1.

Entonces, sabemos que el método index () del ThreadsController es el método responsable de mostrar los hilos. Así que tendremos que trabajar en ese método para arreglar algunas cosas. Aquí está el código actual ubicado en ThreadsController @ index:

En este momento, el código no ofrece un medio para determinar * quién * está haciendo la solicitud para ver los hilos. Nuestro objetivo es crear una lógica en la que si un usuario proporciona algún tipo de filtro por medio de una cadena de consulta, solo se deben mostrar esos hilos en particular. Vamos a configurar eso ahora.


Cómo filtrar por cadena de consulta

Algunas cosas han cambiado ahora en el siguiente código. En los primeros bloques if y else, eliminamos la llamada a get () en la consulta. Ahora, simplemente estamos creando la consulta, pero todavía no la estamos activando. La razón de esto es porque ahora queremos agregar otro escenario condicional. Ese escenario es, ¿qué pasa si se proporciona una cadena de consulta en el campo URL? Bueno, eso es exactamente lo que configuramos en el siguiente bloque if. Que si la declaración dice, si ve algo como esto en la consulta http://forum.io/threads?by=SomeUserName, entonces vamos a activar una consulta usando una cláusula where donde el campo 'nombre' en la base de datos es igual a SomeUserName.

Tenemos un usuario ficticio llamado asdf configurado en nuestra base de datos, así que carguemos esta URL http://forum.io/threads?by=asdf y veamos qué sucede ahora.
filtrar por cadena de consulta

¡Fantástico! Está funcionando. Lo bueno de este enfoque de cadena de consulta es que ni siquiera tuvimos que modificar el archivo de rutas. Simplemente verificamos la presencia de una clave en particular en la URL usando la función request (). Entonces ahora tenemos tres opciones diferentes para la consulta en nuestro método index (). Podemos consultar por canal, consultar todo o consultar por nombre de usuario en una cadena de consulta. Muy genial. Solo para estar seguros, ejecutemos nuestra prueba una vez más, debería funcionar ahora.

vagabundo @ homestead: ~ / Code / forumio $ phpunit --filter test_a_user_can_filter_by_any_username
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

. 1/1 (100%)

Tiempo: 1,44 segundos, memoria: 8,00 MB

OK (1 prueba, 2 afirmaciones)

Agregar un enlace para filtrar los hilos de los usuarios autenticados

Si agregamos un enlace ahora a uno de nuestros archivos de vista para filtrar los hilos del usuario autenticado, sabemos que funcionará ahora. Sigamos adelante y abramos app.blade.php y hagamos algunos ajustes. Aquí reorganizamos algunos de los enlaces en el menú de la barra de navegación y también agregamos un enlace para filtrar por los hilos del usuario autenticado.

cómo crear un enlace para la cadena de consulta en la URL


Comience y termine con el conjunto completo de pruebas

Comenzamos este tutorial ejecutando nuestro conjunto completo de pruebas, y es algo bueno que lo hicimos porque encontramos un doozy que tuvimos que arreglar. En este punto, hemos agregado una función, creamos una prueba para esa función y la probamos de forma aislada de todas nuestras otras pruebas. Necesitamos ejecutar todas las pruebas una vez más para asegurarnos de que todo funcione correctamente.

vagabundo @ homestead: ~ / Código / forumio $ phpunit
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

........ FFFE ......... 21/21 (100%)

Tiempo: 3,43 segundos, memoria: 22,00 MB

Hubo 1 error:

1) Pruebas \ Característica \ ReadThreadsTest :: test_a_user_can_filter_threads_according_to_channel
ErrorException: tratando de obtener la propiedad de un no objeto (Ver: / home / vagrant / Code / forumio / resources / vie ws / layouts / app.blade.php) (Ver: / home / vagrant / Code / forumio / resources / views /layouts/app.blade.php)

Hubo 3 fallas:

1) Pruebas \ Característica \ ReadThreadsTest :: test_a_user_can_browse_threads
2) Pruebas \ Característica \ ReadThreadsTest :: test_a_user_can_read_a_single_thread
3) Pruebas \ Característica \ ReadThreadsTest :: test_a_user_can_see_replies_that_are_associated_with_a_thread

Hmmm. 1 error y 3 fallos. El mensaje de error anterior se ha simplificado por brevedad, pero debemos solucionar estos problemas. Podemos abordar estos uno a la vez. Primero, ejecutemos la primera prueba que notamos que falló.

vagrant @ homestead: ~ / Code / forumio $ phpunit --filter test_a_user_can_browse_threads
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

F 1/1 (100%)

Tiempo: 1,24 segundos, memoria: 14,00 MB

Hubo 1 falla:

1) Pruebas \ Característica \ ReadThreadsTest :: test_a_user_can_browse_threads
"ErrorException arrojado con mensaje" Intentando obtener la propiedad de un no-objeto (Ver: /home/vagrant/Code/forumio/resources/views/layouts/app.blade.php) (Ver: / home / vagrant / Code / forumio / resources / views / layouts / app.blade.php) "\ n

No se pudo afirmar que (el html) 'contiene "Odit ea libero sequi qui quis ut.".

Parece que estamos lanzando un error en el archivo app.blade.php donde estamos tratando de obtener una propiedad de un no objeto. En realidad, esto tiene sentido, porque cuando colocamos el nuevo enlace en la barra de navegación, asumimos que habría un usuario registrado para ver ese enlace. ¿Qué pasa si no hay un usuario registrado? También debemos tener en cuenta ese escenario. Visitemos una vez más el código de la barra de navegación y lo actualicemos. Solo queremos mostrar ese filtro por enlace de cadena de consulta si realmente hay un usuario registrado.

Ahora podemos ejecutar la prueba nuevamente y ver cómo funciona.

vagrant @ homestead: ~ / Code / forumio $ phpunit --filter test_a_user_can_browse_threads
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

. 1/1 (100%)

Tiempo: 1,11 segundos, memoria: 8,00 MB

OK (1 prueba, 2 afirmaciones)

Eso se ve genial. Solo por sonrisas, ejecutemos toda la suite y veamos si ese cambio solucionó las otras pruebas fallidas también.

vagabundo @ homestead: ~ / Código / forumio $ phpunit
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

..................... 21/21 (100%)

Tiempo: 2,69 segundos, memoria: 12,00 MB

OK (21 pruebas, 37 afirmaciones)

¡Bien! Parece que simplemente arreglar esa prueba solucionó todos los problemas que teníamos.


Cómo filtrar por resumen de cadenas de consulta

Hemos agregado con éxito otra característica a nuestra aplicación de muestra en expansión. Es de esperar que haya disfrutado aprendiendo todo sobre la creación de cadenas de consulta en la URL para obtener conjuntos de datos específicos de la base de datos.