es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo agregar Multi-filtro en la búsqueda de Laravel Livewire.

He hecho una barra de búsqueda simple que funciona bien, pero me pierdo al agregar 2 filtros (año escolar ‘sy’) y (semestre ‘sem’) utilizando un menú desplegable. Si el usuario selecciona un año escolar o semestre específico, la búsqueda solo mostrará datos que contengan ese año escolar y semestre.

$allschedule = DB::table('load_schedule')
        ->leftjoin('emp_info', 'load_schedule.faculty_id', '=','emp_info.user_id')

        ->orderBy('apellido', 'ASC')
        ->orWhere('seccion', 'like', $src)
        ->orWhere('salón', 'like', $src)
        ->orWhere('apellido', 'like', $src)
        ->orWhere('nombre', 'like', $src)
        ->select('load_schedule.*', 'emp_info.nombre', 'emp_info.apellido')
        ->paginate(10);
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para agregar filtros para el año y el semestre escolar, puede modificar la consulta $allschedule de la siguiente manera:

    $allschedule = DB::table('load_schedule')
        ->leftJoin('emp_info', 'load_schedule.faculty_id', '=', 'emp_info.user_id')
        ->orderBy('lastname', 'ASC')
        ->when($src, function ($query, $src) {
            return $query->where(function ($query) use ($src) {
                $query->where('section', 'like', "%$src%")
                    ->orWhere('room', 'like', "%$src%")
                    ->orWhere('lastname', 'like', "%$src%")
                    ->orWhere('firstname', 'like', "%$src%");
            });
        })
        ->when(request()->has('sy'), function ($query) {
            return $query->where('schoolyear', request()->input('sy'));
        })
        ->when(request()->has('sem'), function ($query) {
            return $query->where('semester', request()->input('sem'));
        })
        ->select('load_schedule.*', 'emp_info.firstname', 'emp_info.lastname')
        ->paginate(10);
    

    En esta consulta modificada:

    • Usamos el método when() para agregar condicionalmente los filtros del año y semestre escolar.
    • Las funciones request()->input('sy') y request()->input('sem') recuperan los valores de los campos de entrada sy y sem, respectivamente.
    • El método has() se utiliza para comprobar si estos campos de entrada están presentes en la solicitud.
    • El método where() se utiliza para agregar los filtros a la consulta.
    • También usamos otro método when() para agregar condicionalmente el filtro de búsqueda, como antes.

    Para implementar los filtros de lista desplegable en su vista, puede agregar dos elementos select para el año y el semestre escolar e incluirlos en un formulario con un botón de envío. Los elementos select deben tener opciones correspondientes a los años y semestres escolares disponibles en su base de datos. Puede recuperar estos valores utilizando otra consulta y pasarlos a su vista mediante una variable.

    Aquí hay un ejemplo de implementación:

    <form method="get" action="{{ url('/search') }}">
        <label for="sy">Año escolar:</label>
        <select name="sy" id="sy">
            <option value="">Todo</option>
            @foreach ($schoolyears as $sy)
                <option value="{{ $sy }}">{{ $sy }}</option>
            @endforeach
        </select>
        <label for="sem">Semestre:</label>
        <select name="sem" id="sem">
            <option value="">Todo</option>
            @foreach ($semesters as $sem)
                <option value="{{ $sem }}">{{ $sem }}</option>
            @endforeach
        </select>
        <label for="q">Búsqueda:</label>
        <input type="text" name="q" id="q" value="{{ $q }}">
        <button type="submit">Buscar</button>
    </form>
    

    En este formulario de ejemplo:

    • El atributo action debe apuntar a la URL de su función de búsqueda.
    • Los atributos name de los elementos select deben coincidir con los nombres utilizados en la consulta $allschedule modificada anteriormente.
    • Los atributos value de las opciones Todo deben estar vacíos, para indicar que no se aplica ningún filtro.
    • Las variables $schoolyears y $semesters deben ser matrices de los valores de año y semestre disponibles, respectivamente. Puede recuperar estos valores usando una consulta separada como esta:
    $schoolyears = DB::table('load_schedule')
        ->distinct('schoolyear')
        ->pluck('schoolyear')
        ->toArray();
    
    $semesters = DB::table('load_schedule')
        ->distinct('semester')
        ->pluck('semester')
        ->toArray();
    

    En esta consulta de ejemplo:

    • Usamos el método distinct() para recuperar solo valores únicos de las columnas schoolyear y semester de su tabla load_schedule.
    • El método pluck() se utiliza para recuperar los valores como una colección.
    • El método toArray() se utiliza para convertir la colección en una matriz que se puede pasar a su vista.

Comments are closed.