Skip to content

Filtros del Query Builder

El sistema de filtros de Laravel RoutingKit utiliza un patrón Query Builder que permite encadenar múltiples filtros antes de obtener los resultados finales. Todos los filtros se aplican sobre la instancia singleton del orquestador.

Antes de aplicar cualquier filtro, debes iniciar una nueva consulta:

$query = rk_navigation()->newQuery();

Nota importante: El método newQuery() reinicia todos los filtros anteriores y proporciona un estado limpio para la nueva cadena de consulta.

MétodoPropósitoParámetros
loadContexts()Carga contextos específicosstring|array $contextKeys
loadAllContexts()Carga todos los contextos disponibles-
excludeContexts()Excluye contextos específicosstring|array $contextKeys
resetContexts()Reinicia contextos al estado por defecto-
withDepth()Filtra por nivel de profundidad máximoint|null $level
filterByDepth()Alias de withDepthint|null $level
forUser()Filtra para un usuario específicostring|null $userId
prepareForUser()Prepara filtro para usuario autenticadostring|null $userId
filterForCurrentUser()Filtra para el usuario actual-
filterForPermissions()Filtra por permisosarray|Collection $permissions
filterForRoles()Filtra por rolesCollection $roles
filterOnlyFiles()Muestra solo archivos de contextos específicosstring|array $contextKeys
filterAllFiles()Muestra todos los archivos de todos los contextos-
withEmptyGroups()Incluye grupos vacíos en resultadosbool $value = true
resetFilters()Reinicia todos los filtros aplicados-

Los filtros de contexto controlan qué conjuntos de navegación se cargan:

// Cargar contextos específicos
$query = rk_navigation()
->newQuery()
->loadContexts(['headerDashboard', 'footerDashboard']);
// Cargar todos los contextos
$query = rk_navigation()
->newQuery()
->loadAllContexts();
// Excluir contextos específicos
$query = rk_navigation()
->newQuery()
->loadAllContexts()
->excludeContexts(['adminPanel']);

Estos filtros controlan el acceso basado en permisos del usuario:

// Filtrar por permisos específicos
$permissions = ['dashboard.view', 'users.edit'];
$query = rk_navigation()
->newQuery()
->loadContexts(['headerDashboard'])
->filterForPermissions($permissions);
// Filtrar por roles
$userRoles = collect(['admin', 'editor']);
$query = rk_navigation()
->newQuery()
->filterForRoles($userRoles);
// Filtrar para el usuario autenticado actual
$query = rk_navigation()
->newQuery()
->filterForCurrentUser();

Controlan la profundidad y estructura del árbol de navegación:

// Limitar profundidad a 2 niveles
$query = rk_navigation()
->newQuery()
->loadContexts(['headerDashboard'])
->withDepth(2);
// Incluir grupos vacíos en los resultados
$query = rk_navigation()
->newQuery()
->loadContexts(['headerDashboard'])
->withEmptyGroups(true);

Filtros específicos para usuarios:

// Para un usuario específico por ID
$query = rk_navigation()
->newQuery()
->forUser('user-123');
// Para el usuario autenticado (con manejo de errores)
$query = rk_navigation()
->newQuery()
->prepareForUser(); // Puede lanzar RuntimeException si no hay usuario autenticado
// Alternativa más segura para usuario actual
$query = rk_navigation()
->newQuery()
->filterForCurrentUser();

Controlan qué archivos de navegación se incluyen:

// Solo archivos de contextos específicos
$query = rk_navigation()
->newQuery()
->filterOnlyFiles(['headerDashboard']);
// Todos los archivos de todos los contextos
$query = rk_navigation()
->newQuery()
->filterAllFiles();

Ejemplo 1: Navegación Principal con Permisos

Section titled “Ejemplo 1: Navegación Principal con Permisos”
$headerQuery = rk_navigation()
->newQuery()
->loadContexts(['headerDashboard'])
->filterForPermissions($permissions)
->withDepth(3);
$headerItems = $headerQuery->get();

Ejemplo 2: Navegación Completa para Usuario Actual

Section titled “Ejemplo 2: Navegación Completa para Usuario Actual”
$fullQuery = rk_navigation()
->newQuery()
->loadContexts(['headerDashboard', 'footerDashboard'])
->filterForCurrentUser()
->withEmptyGroups(false);
$allItems = $fullQuery->all();

Ejemplo 3: Obtener Nodo Activo con sus Hijos

Section titled “Ejemplo 3: Obtener Nodo Activo con sus Hijos”
$fullQuery = rk_navigation()
->newQuery()
->loadContexts(['headerDashboard', 'footerDashboard'])
->filterForPermissions($permissions);
$activeNode = $fullQuery->getActiveNodeParentWithChildren();

Los métodos terminales ejecutan la consulta y devuelven resultados:

MétodoDescripciónRetorna
get()Obtiene el árbol filtradoCollection
all()Alias de get()Collection
allFlattened()Obtiene estructura aplanadaCollection
getSubBranch($id)Obtiene sub-rama específicaCollection
getSubBranches($ids)Obtiene múltiples sub-ramasCollection
getForCurrentUser()Obtiene árbol para usuario actualCollection
getCurrentActiveNode()Obtiene nodo activo actualRkEntityInterface|null
getActiveNodeParentWithChildren()Obtiene padre del nodo activo con hijosRkEntityInterface|null
getBreadcrumbsForCurrentRoute()Obtiene migas de pan para ruta actualCollection
  1. Estado Singleton: Cada entidad mantiene una instancia singleton del orquestador, por lo que los filtros persisten hasta que se llama a newQuery().

  2. Orden de Filtros: Los filtros se pueden aplicar en cualquier orden, pero se recomienda aplicar filtros de contexto primero.

  3. Rendimiento: El sistema utiliza caché interno para optimizar consultas repetitivas.

  4. Reinicio de Filtros: Usa resetFilters() para limpiar filtros sin crear una nueva consulta, o newQuery() para un reinicio completo.