Interesante la explicación del global Scope, les recomiendo ver un ejemplo de implementación.
Introducción: comprende el concepto de ORM y el papel de Eloquent en Laravel
Qué aprenderás sobre eloquent ORM
¿Qué es un ORM y para qué sirve Eloquent?
Diseña la base de datos de tu proyecto con Laravel y Eloquent
Diseña un banco de proyectos y su base de datos
Crea un proyecto Laravel y configura una base de datos MySQL
Generar el modelo para la tabla de proyectos
Diferencias entre Modelo y Migración
Convenciones para los modelos
Atributos por defecto en un modelo
Realiza consultas de datos con Eloquent
Estructura de modelos, rutas y controladores para consultar datos
Chunk: fragmentando múltiples registros
Métodos de búsqueda y Not Found Exceptions
Construye un CRUD en Laravel con Eloquent
Cómo insertar nuevos registros
Actualizando registros de la base de datos
Consideraciones y buenas prácticas para eliminar datos
Consultas avanzadas con Eloquent
Query Scopes
Query Builder
Conclusiones
Cierre del curso
Lectura
Otra de las posibilidades que tenemos con los modelos es que podemos definir el alcance de las operaciones que realicemos con los modelos a través de los Scopes.
Esto quiere decir que podemos restringir la cantidad o los valores que nuestro modelo retornará a una condición especÃfica. Un caso de uso para los Query Scopes serÃa, por ejemplo, si quisiéramos restringir la consulta de datos a solo los que tengan el project_id mayor a 100, esto quiere decir que aún si se consultan todos los registros de la tabla projects a través del modelo Project, se le listarán todos los proyectos con project_id mayor a 100 y los 100 primeros no aparecerán aún cuando estén activos y existentes en la tabla.
Por supuesto, son más los aspectos en los cuales los podemos usar, pero también dependerá de ciertas condiciones que nos de el proyecto en el cual estemos trabajando.
Los Scopes Globales los encontramos como archivos que están aparte, en su implementación más básica, generalmente están en la carpeta App/Scopes y se componen de una estructura como esta:
namespace App\Scopes;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
class AgeScope implements Scope
{
public function apply(Builder $builder, Model $model)
{
$builder->where('age', '>', 200);
}
}
Este ejemplo se implementarÃa llamando este Scope en nuestro controlador, su función apply
recibe dos parámetros, el primero es el builder o la sentencia que escribimos para ejecutar acciones (el código que usamos para realizar acciones sin usar SQL) y luego el modelo, lo que hará este método será agregarle a la sentencia del builder la condición de que la edad sea mayor a 200 (para efectos de este ejemplo).
Podemos tener Scopes locales, este lo agregamos en forma de una función dentro del modelo y lo anexamos directamente a la consulta cuando se vaya a realizar, por ejemplo:
public function scopeActive($query) {
return $query->where('is_active', 1);
}
Si implementamos esta función y la llamamos en ProjectController justo cuando estamos haciendo una consulta de datos, nos agregará por debajo la condición de que sólo traerá registros cuyo valor en el campo is_active sea igual a 1.
La forma de implementarlo serÃa la siguiente:
Project::active()->get();
Puedes usar Global Scope o Local Scope dependiendo de tu necesidad, yo te recomendarÃa que lo hagas cuando sea necesario y de manera local (o sea, dentro del modelo), de esta forma tendrás un control más personalizado del ámbito en el cual controlas tus datos.
En la siguiente clase conocerás sobre una herramienta que nos permite crear consultas e interactuar con la base de datos de una manera más limpia y segura llamada Query Builder.
Aportes 8
Preguntas 0
Interesante la explicación del global Scope, les recomiendo ver un ejemplo de implementación.
Interesante, en resumen, lo que hacen estas query’s scopes es anexar más condiciones a la consulta original, pero las anexara siempre que requieras usar el modelo, de esa forma le hace el filtro a absolutamente todas las consultas que hagas para dicho modelo, puede llegar a ser útil en casos particulares
Generalmente utilizó los Local Scope, creo que sólo en una ocasión necesite de un GlobalScope, pero el más común que he utlizado es crear un Global Scope para un campo published_at de tipo datetime, se vuelve muy útil. Lo que hace es que evalua que sólo publique aquellos registros que NO tengan fechas futuras.
namespace App\Scopes;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
class PublishedScope implements Scope
{
public function apply(Builder $builder, Model $model)
{
$builder->where('published_at', '<=', \Carbon\Carbon::now());
}
}
Scope o alcances es el nivel de funcionalidad de nuestra clase, variable o metodo hasta donde puede funcionar
Los Query Scopes permiten limitar la información que ven los usuarios de la App, si asà lo hemos programado.
Genial, se me ocurre que se pueden usar para listar los registros con status_id = 1 (activos) y no tener que hacer un where en cada acción de controlador, excelente herramienta
Un ejemplo sencillo de un Scope es enviar los ids de un modelo que no se quieren buscar:
Local Scope esta brutal me gusto mucho y expandió mi mente para tenerlo presente
¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.