Los Query Scope de Laravel son métodos personalizados que sirven para darle súper poderes a nuestras consultas Eloquent. Un ejemplo sería escribir un scope que tenga la lógica de obtener los usuarios activos:
Es un scope muy simple pero dentro del método del scope tu puedes agregar la lógica que necesite tu sistema.
Si queres saber más de los scope, puedes visitar la documentación oficial de Laravel: https://laravel.com/docs/5.8/eloquent#query-scopes.
Problema con los Query Scope de Laravel
Hay algunas reglas que debemos seguir para poder definir y utilizar los query scopes correctamente:
- Todos los scopes deben recibir la variable
$query
. - Todos los nombres de los scopes deben comenzar con la palabra «scope» y luego el nombre que queramos utilizar para invocarlo.
La última regla es la que trae problemas para algunas personas. Ya que, cuando queremos utilizar el scope no utilizamos User::scopeActive()
, sino que hacemos User::active()
. Por lo tanto, nuestro IDE no puede detectar el scope y no aparece en la lista de métodos disponibles cuando hacemos Ctrl + space
(en el caso de PhpStorm y otros IDEs).
¡Pero como todo en la vida, hay una solución! (menos que vuelva tu ex. 😅)
Una alternativa a los Query Scope: POO al rescate!
Gracias a un recurso de la Programación Orientada a Objetos (POO), tenemos una alternativa para los Query Scope tal como los ofrece Laravel. Es una alternativa muy sencilla de implementar, que funciona exactamente igual pero con el beneficio que es «IDE friendly» y es utilizando métodos estáticos 😉.
Veamos el ejemplo anterior pero con un método estático:
De esta forma podemos reemplazar los Query Scopes por métodos estáticos y nuestro sistema se comportará exactamente igual. Además, nuestro IDE podrá indexar estos métodos para ofrecerlos cuando escribimos código.
Conclusión
Gracias a los recursos que nos brinda la programación orientada a objetos, podemos reemplazar, de una forma fácil y sencilla, algunas de las herramientas que no nos interesa de Laravel. Con este artículo no quiero decir que una forma sea mejor que la otra, nada mas brindo este tip y tu decides que forma utilizar. Espero que te haya gustado y nos vemos en la próxima 😉🤙.
Excelente articulo, creo que es muy atractivo el uso de este metodo ya que mantiene legibilidad y hasta se parece a la sintaxis de los facades jeje gracias
Muchas gracias por tu comentario Ariel. Saludos.
¿Cual es la diferencia aparte de ahorrarse el problema con el IDE?
¿Existe alguna pro o contra al utilizar estéticamente el metodo?
Hola Eduar, como estas? No, no hay otro beneficio a parte del IDE. El contra que le encontré es que no podes encadenar estáticos (a menos que pongas una where, por ejemplo, entre medio) como si lo podes hacer con los scope.
Ah, entiendo…
¡¡Gracias por el tip!!
Una ayuda para el IDE es el plugin de Barry Heuvel, Laravel IDE Helper.
Mediante anotaciones permite que el IDE (En mi caso phpstorm) reconozca los scopes, atributos, etc… en los modelos. La verdad es que facilita bastante la vida
Muchas gracias por tu aporte.
Gracias por este artículo, en verdad es útil, trataré de implementarlo en mi proyecto de la u 😀
Pero si lo usas como static al scope solo podés usarlo ahí y no en un controlador o si?
Si podes usarlo. Por que decís que no?
hombre, esto es oro puro, muchas gracias….