Laravel-datatables: La función de búsqueda rápida de yajra Datatables no busca

Creado en 7 jun. 2016  ·  17Comentarios  ·  Fuente: yajra/laravel-datatables

¡Buen día!

Tengo un problema con la búsqueda de registros en mis tablas de datos. Solo se puede buscar en la columna tracking_id. Necesito que se busquen todas las columnas.

Aquí está mi código php de consulta:

$result = Document::join('user','document.user_id','=','user.id')
->join('classification','document.classification_id','=','classification.id')
->select('document.id',DB::raw('CONCAT(document.tracking_type,"-",document.tracking_date,"-",document.tracking_seq_no) AS tracking_id'),'document.date_prepared','document.subject','classification.description as doc_class')
->orderBy('document.created_at','desc')->get();

return Datatables::collection($result)
->addColumn('check',function($record){
    return '<input type="checkbox" name="check['.$record->id.']" class="checkboxes" value='.$record->id.'>';})
->addColumn('action',function($record){
    return '<a href="/records/view/' . $record->tracking_id . '">View Record</a></a>';})
->addColumn('document.tracking_id',function($record){
    return $record->tracking_id;})
->editColumn('document.doc_class',function($record){
    return $record->doc_class;})
->addColumn('document.subject',function($record){
    return $record->subject;})
->addColumn('document.date_prepared',function($record){
    return date('F d, Y', strtotime($record->date_prepared));})
->make(true);

Declaración JS:

docstable = $('.docstable').DataTable({
    processing: true,
    serverSide: true,
    ajax: "/ajax/docrec"
    columnDefs: [
        {targets:[0,1], orderable:false}
    ],
    columns: [
        {data:'check'},
        {data:'action'},
        {data:'tracking_id',name:'document.tracking_id'},
        {data:'doc_class',name:'document.doc_class'},
        {data:'subject',name:'document.subject'},
        {data:'date_prepared',name:'document.date_prepared'}
    ]
});

¿Hay alguna manera como Bllim Datatables que pueda buscar todas las columnas especificadas usando searchColumns () en el código php? Gracias

question

Comentario más útil

Hola @ChaosPower y muchas gracias por tu respuesta.

Probé tu solución pero no funcionó. En realidad, $this->mainRepo->model es mi instancia de modelo, de App \ Models. Está vinculado a las cosas mainRepo pero no está relacionado con mi problema.
Actualicé para tener algo como esto (de mi repositorio):
$query = $this->model->with($with);
$dataTable ?: $query->orderBy($orderBy, $sort);
return !$dataTable ? $query->get($columns) : $query->select($columns);

Utilizo este método para administrar todos los datos de DataTables de mis modelos. Si la variable dataTable es falsa, no se aplica ningún orden y yo uso un select('*') .

Al final, el método encadenado podría verse así:
$this->model->with('relation')->select('*'); donde $this->model es App\Models\User .

El orden de las columnas ahora funciona perfectamente, pero la búsqueda de texto predeterminada aún no tiene ningún efecto en la búsqueda. Todos los resultados se muestran sin depender de mi entrada.
¿Hice algo mal de nuevo?

Vemos aquí mi entrada de búsqueda, pero se devuelven todos mis 3 usuarios, incluso si la entrada 'mi valor de búsqueda' no devuelve nada en absoluto.
capture

Muchas gracias por tu ayuda

Todos 17 comentarios

La búsqueda rápida en todas las columnas es compatible de forma predeterminada, pero dado que está utilizando consultas de combinación, hay algunos cambios sobre cómo debe declarar el nombre en su script como en esta demostración .

Por cierto, ¿por qué están usando la colección en lugar de elocuente? Le sugiero que elimine get() en su consulta y use return Datatables::eloquent($result) lugar.

Hola !
Para mí, la búsqueda global siempre devuelve un resultado vacío. Mi tabla de datos está vacía después de la búsqueda. Lleno de todos los datos cuando elimino todas las entradas de búsqueda.
Pero lo hago tan simple como:
$users = $this->mainRepo->model->get(); return Datatables::of($users)->make(true);

Puedo ver en la solicitud HTTP mi entrada de búsqueda, pero el resultado de la fila siempre está vacío. ¿Necesito hacer algo en el lado del servidor para permitir las opciones de búsqueda global? Pensé que era automático ...
capture

Los datos provienen de mi Repositorio con básicamente un $ model-> get () sin ningún orden / clasificación. Pensé que era suficiente hacer un filtrado de texto global y de columna. ¿Pero necesito implementar una solución para usar un 'dónde' en mi solicitud Eloquent? ¿O es mejor filtrar usando el método de filtro DataTables? (En caso de que nada sea automático, y necesito hacer todo el lado del servidor).

Pero este ejemplo y este no implementan ningún procesamiento del lado del servidor y obtienen una búsqueda global, incluso por búsqueda de columna ... Probé todos esos ejemplos, sin éxito: el resultado de la búsqueda siempre está vacío, la tabla de datos está vacía en el primer carácter de búsqueda enviar y volver a llenar con todos los datos cuando no se llena ningún filtro ...

Las preguntas básicas son: ¿Hay algo implementado en el paquete para el filtrado / búsqueda del lado del servidor desde Model Datas, o solo hay clasificación y paginación de columnas disponibles?

¡Muchas gracias por tu lectura y tu ayuda!

PD: vinculado a mi comentario # 562

@ mtx-z cuando invoca -> get () está usando colecciones en lugar del objeto de LDT.

$users = User::select(['id', 'name', 'email', 'password', 'created_at', 'updated_at']); //Eloquent Object

$users->all(); // Collection

Laravel Datatables lo hace automáticamente -> get () y le aconsejo que no use -> get () cuando

return Datatables::of($users)->make(true);

Según su ejemplo, no necesita -> get ()


$users = $this->mainRepo->model->get(); return Datatables::of($users)->make(true);

sólo


$users = $this->mainRepo->model; return Datatables::of($users)->make(true);

Para su pregunta principal sobre filtrado y búsqueda. Laravel Datatables ya implementa la búsqueda en todas las columnas por defecto / procesamiento del lado del servidor. Y también admite el filtrado de columnas individuales.

https://datatables.yajrabox.com/eloquent/basic - ver encabezados transmitidos
https://datatables.yajrabox.com/eloquent/multi-filter-select - ver encabezados transmitidos

Hola @ChaosPower y muchas gracias por tu respuesta.

Probé tu solución pero no funcionó. En realidad, $this->mainRepo->model es mi instancia de modelo, de App \ Models. Está vinculado a las cosas mainRepo pero no está relacionado con mi problema.
Actualicé para tener algo como esto (de mi repositorio):
$query = $this->model->with($with);
$dataTable ?: $query->orderBy($orderBy, $sort);
return !$dataTable ? $query->get($columns) : $query->select($columns);

Utilizo este método para administrar todos los datos de DataTables de mis modelos. Si la variable dataTable es falsa, no se aplica ningún orden y yo uso un select('*') .

Al final, el método encadenado podría verse así:
$this->model->with('relation')->select('*'); donde $this->model es App\Models\User .

El orden de las columnas ahora funciona perfectamente, pero la búsqueda de texto predeterminada aún no tiene ningún efecto en la búsqueda. Todos los resultados se muestran sin depender de mi entrada.
¿Hice algo mal de nuevo?

Vemos aquí mi entrada de búsqueda, pero se devuelven todos mis 3 usuarios, incluso si la entrada 'mi valor de búsqueda' no devuelve nada en absoluto.
capture

Muchas gracias por tu ayuda

Finalmente lo hice :) ty

También de repente no puedo buscar la relación, usé $ this-> model-> with ('ratio') -> select ('*');
mtx-z ¿puedes compartir la solución?

Oye. El código que utilicé fue específico para mí.
El modelo this-> contiene una instancia de mi modelo.

¿Puede proporcionar su código?

\\ In controller
$result = MsCustomer::with('company')->select('ms_customers.*');
return Datatables::of($result)->make(true);

\\ In view
$('#data-table').DataTable({
    ajax: '{!! route('master.customer.data') !!}',
    columns: [
        { data: 'id', name: 'id' },
        { data: 'code', name: 'code' },
        { data: 'name', name: 'name' },
        { data: 'email', name: 'email' },
        { data: 'company.name', name: 'company.name' },
   ]
});

Los datos de ejecución y visualización de tablas de datos incluyen la relación company.name , pero no pueden buscar la relación. Supongo que el código ya es similar a esta demostración.

Tengo el modelo MsCustomer con declare protected $ table = 'ms_customers', también relación 'empresa' dentro del modelo MsCustomer. Luego, el modelo MsCompany con el nombre de tabla 'ms_ companies'.

Puedo buscar ID, código, nombre y correo electrónico, pero no la relación 'empresa.nombre'. ¿Hay algún problema con el código anterior?

Tengo el mismo problema con @maengkom , mi tabla se cargó bien. pero cuando busco el resultado siempre vacio

en controlador

$agenda = AgendaMasuk::with('surat')
            ->whereNotNull('surat_id')->where('group_id', $group->id)
            ->select('agenda_masuks.*');
        return Datatables::of($agenda)->make(true);

en vista

var table = $('#surats').DataTable({
        "jQueryUI"   : true,
        "paging"     : true,
        "lengthMenu" : [ 5, 10, 25, 50, 75, 100, "All" ],
        "autoWidth"  : false,
        "stateSave"  : false,
        "order"      : [[ 0, 'asc' ]],
        "processing" : true,
        "scrollX"    : true,
        "serverSide" : true,
        "ajax": {
            "url": $('#surats').data('url'),
            "type": "POST"
        },
        "columns": [
            {
                className: 'text-center',
                data: 'no_agenda',
                name: 'agenda_masuks.no_agenda'
            },
            {
                className: 'text-center',
                data: 'surat.no_surat',
                name: 'surat.no_surat'
            },
            {
                className: 'text-center',
                data: 'tanggal',
                name: 'agenda_masuks.tanggal'
            },
            {
                data: 'surat.sifat',
                name: 'surat.sifat',
                sortable: false
            },
            {
                data: 'surat.pengirim',
                name: 'surat.pengirim'
            },
            {
                data: 'surat.tujuan',
                name: 'surat.tujuan'
            },
            {
                data: 'surat.ringkasan',
                name: 'surat.ringkasan',
                sortable: false
            },
            {
                data: null,
                defaultContent: '-',
                name: 'disposisi',
                searchable: false,
                sortable: false
            },
            {
                data: null,
                defaultContent: '-',
                name: 'file',
                searchable: false,
                sortable: false
            }
        ]
    });

@maengkom Tengo el mismo problema, no pude usar la búsqueda global en valores de objeto Y valores de relación (solo la identificación).
Por ejemplo, todos mis modelos tienen un "modelo_traducción" asociado. Que contienen el texto público y solo eso. Bueno, mi tabla de datos no puede buscar automáticamente el nombre de las traducciones.

Para solucionar eso, edité la llamada ajax para agregar algún parámetro (búsqueda de texto, seleccionar valor ...) y uso estos valores para filtrar la consulta elocuente antes de enviarla a Datatable.
Desde aquí, puede filtrar por cualquier cosa (para el caso real, es un "donde" con un "mientras que traducción" donde "traducciones.nombre = 'valor_búsqueda'", ya que es elocuente.

@nsetyo ¿has comprobado la colección devuelta? ¿Los datos de la colección coinciden con las necesidades de la tabla de datos?

@ mtx-z sí lo hace. soluciono temporalmente esto con el uso de consultas de unión en su lugar

@nsetyo @ mtx-z el propietario ya confirmó que la relación de búsqueda todavía tiene un error. mira esto https://github.com/yajra/laravel-datatables/issues/698

Estoy tratando de ayudar a solucionarlo y sigo aprendiendo el código en el método de filtrado dentro del paquete, pero sigo confundiendo dónde debería arreglarse

Todos mis campos de búsqueda están funcionando ahora, pero me queda 1 problema. Según la demostración proporcionada por yajra (propietario), hay un campo Creado en y actualizado en la tabla. También tengo un campo en mi tabla que muestra la fecha y la hora, pero la cuestión es que si formateé la fecha y la hora mostradas en un formato mucho más legible para los usuarios, la tabla de datos no pudo buscar la fecha y la hora recién formateadas.

Ejemplo: (se muestra el formato de fecha y hora predeterminado)
2016-08-23 14:37:25

Lo formateé en:
23 DE AGOSTO DE 2016 02:37:25 PM

usando date('F d, Y h:i:s a',strtotime($the_given_date_and_time));

Después de formatear, la tabla de datos no pudo buscar ese campo

Puede usar filterColumn api para anular el sql predeterminado para buscar en la columna de fecha para que coincida con lo que se mostró.

Para addcolumn, debería poder buscarse.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

Mopster picture Mopster  ·  3Comentarios

sangnguyenplus picture sangnguyenplus  ·  3Comentarios

jgatringer picture jgatringer  ·  3Comentarios

hohuuhau picture hohuuhau  ·  3Comentarios

kamrava picture kamrava  ·  3Comentarios