Laravel-datatables: yajra Função de pesquisa rápida de tabelas de dados sem pesquisa

Criado em 7 jun. 2016  ·  17Comentários  ·  Fonte: yajra/laravel-datatables

Bom Dia!

Estou tendo problemas com a pesquisa de registros em minhas tabelas de dados. Apenas a coluna tracking_id pode ser pesquisada. Preciso que todas as colunas sejam pesquisadas.

Aqui está o meu 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);

Declaração 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'}
    ]
});

Existe uma maneira como Bllim Datatables que pode pesquisar todas as colunas especificadas usando searchColumns () no código php? Obrigado

question

Comentários muito úteis

Olá @ChaosPower e muito obrigado pela sua resposta.

Tentei sua solução, mas não funcionou. Na verdade, $this->mainRepo->model é minha instância de modelo, em App \ Models. Está vinculado ao material mainRepo, mas não está relacionado ao meu problema.
Eu atualizei para ter algo assim (do meu repositório):
$query = $this->model->with($with);
$dataTable ?: $query->orderBy($orderBy, $sort);
return !$dataTable ? $query->get($columns) : $query->select($columns);

Eu uso esse método para gerenciar todos os dados DataTables de meus modelos. Se a variável dataTable for falsa, nenhuma ordenação será aplicada e eu uso um select('*') .

No final, o método encadeado pode ser parecido com:
$this->model->with('relation')->select('*'); onde $this->model é App\Models\User .

A ordem das colunas agora está funcionando perfeitamente, mas a pesquisa de texto padrão ainda não tem efeito na pesquisa. Todos os resultados são exibidos, não dependendo da minha entrada.
Eu fiz algo errado de novo?

Vemos aqui minha entrada de pesquisa, mas todos os meus 3 usuários são retornados, mesmo que a entrada 'meu valor de pesquisa' não retorne nada.
capture

Muito obrigado pela sua ajuda

Todos 17 comentários

A pesquisa rápida em todas as colunas é suportada por padrão, mas como você está usando consultas de junção, há algumas mudanças em como você deve declarar o nome em seu script, como nesta demonstração .

BTW, por que usar coleção em vez de eloquente? Eu sugiro que você remova get() de sua consulta e use return Datatables::eloquent($result) lugar?

Olá !
Para mim, a busca global está sempre retornando um resultado vazio. Minha tabela de dados está vazia após a pesquisa. Preenchido com todos os dados quando removo todas as entradas de pesquisa.
Mas eu faço tão simples como:
$users = $this->mainRepo->model->get(); return Datatables::of($users)->make(true);

Posso ver na solicitação HTTP minha entrada de pesquisa, mas o resultado da linha está sempre vazio. Eu preciso fazer algo do lado do servidor para permitir opções de pesquisa global? Achei que fosse automático ...
capture

Os dados estão vindo do meu Repositório com basicamente fazer um $ model-> get () sem qualquer ordenação / classificação. Achei que fosse o suficiente para fazer alguma filtragem global e de texto de coluna. Mas preciso implementar uma solução para usar um 'onde' na minha solicitação do Eloquent? Ou é melhor filtrar usando o método de filtro DataTables? (No caso de nada é automático, e preciso fazer tudo do lado do servidor).

Mas este exemplo e este não implementam nenhum processamento do lado do servidor e obtêm uma pesquisa global, mesmo por pesquisa de coluna ... Tentei todos esses exemplos, sem sucesso: o resultado da pesquisa está sempre vazio, a tabela de dados está vazia no primeiro caractere de pesquisa enviar e voltar preenchido com todos os dados quando nenhum filtro for preenchido ...

As perguntas básicas são: Há algo implementado no pacote para filtragem / pesquisa do lado do servidor nos Dados do Modelo ou há apenas classificação e paginação de coluna disponíveis?

Muito obrigado pela sua leitura e pela sua ajuda!

PS: vinculado ao meu comentário # 562

@ mtx-z quando você invoca -> get (), você está usando coleções em vez do objeto LDT.

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

$users->all(); // Collection

Laravel Datatables faz automaticamente -> get () e eu aconselho você não usar -> get () quando você

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

Com base no seu exemplo, você não precisa -> get ()


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

somente


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

Para sua pergunta principal sobre filtragem e pesquisa. Laravel Datatables já implementa pesquisa em todas as colunas por padrão / processamento do lado do servidor. E também suporta filtragem de coluna individual.

https://datatables.yajrabox.com/eloquent/basic - veja os cabeçalhos transmitidos
https://datatables.yajrabox.com/eloquent/multi-filter-select - veja os cabeçalhos transmitidos

Olá @ChaosPower e muito obrigado pela sua resposta.

Tentei sua solução, mas não funcionou. Na verdade, $this->mainRepo->model é minha instância de modelo, em App \ Models. Está vinculado ao material mainRepo, mas não está relacionado ao meu problema.
Eu atualizei para ter algo assim (do meu repositório):
$query = $this->model->with($with);
$dataTable ?: $query->orderBy($orderBy, $sort);
return !$dataTable ? $query->get($columns) : $query->select($columns);

Eu uso esse método para gerenciar todos os dados DataTables de meus modelos. Se a variável dataTable for falsa, nenhuma ordenação será aplicada e eu uso um select('*') .

No final, o método encadeado pode ser parecido com:
$this->model->with('relation')->select('*'); onde $this->model é App\Models\User .

A ordem das colunas agora está funcionando perfeitamente, mas a pesquisa de texto padrão ainda não tem efeito na pesquisa. Todos os resultados são exibidos, não dependendo da minha entrada.
Eu fiz algo errado de novo?

Vemos aqui minha entrada de pesquisa, mas todos os meus 3 usuários são retornados, mesmo que a entrada 'meu valor de pesquisa' não retorne nada.
capture

Muito obrigado pela sua ajuda

Eu finalmente consegui :) ty

Eu também de repente não consigo pesquisar relação, usei $ this-> model-> with ('relação') -> select ('*');
mtx-z você pode compartilhar a solução?

Ei. O código que usei era específico para mim.
O modelo this-> contém uma instância do meu modelo.

Você pode fornecer seu 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' },
   ]
});

As tabelas de dados são executadas e os dados de exibição incluem a relação company.name , mas não podem pesquisar a relação. Acho que o código já é parecido com esta demonstração

Tenho o modelo MsCustomer com declare protected $ table = 'ms_customers', também relação 'company' dentro do modelo MsCustomer. Em seguida, o modelo MsCompany com o nome da tabela 'ms_companies'.

Posso pesquisar id, código, nome e e-mail, mas não a relação 'empresa.nome'. Há algo errado com o código acima?

Eu tenho o mesmo problema com @maengkom , minha tabela carregou bem. mas quando procuro o resultado sempre vazio

no controlador

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

em 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 Estou com o mesmo problema, não consegui usar a busca global por valores de objetos E valores de relação (apenas o id).
Por exemplo, todos os meus modelos têm um "translation_model" associado. Que contém o texto público e somente ele. Bem, minha tabela de dados não pode pesquisar automaticamente o nome das traduções.

Para corrigir isso, editei a chamada ajax para adicionar alguns parâmetros (pesquisa de texto, valor selecionado ...) e uso esses valores para filtrar a consulta eloquente antes de enviá-la para Datatable.
A partir daqui, você pode filtrar qualquer coisa (para o caso atual, é um "onde" com uma "tradução", onde "traduções.nome = 'valor_pesquisa'", pois é eloquente.

@nsetyo , você verificou a coleção devolvida? Os dados na coleção correspondem às necessidades de tabela de dados?

@ mtx-z, sim. Eu corrijo isso temporariamente usando consultas de junção

@nsetyo @ mtx-z o proprietário já confirmou que a relação de pesquisa ainda tem um bug. confira https://github.com/yajra/laravel-datatables/issues/698

Estou tentando ajudar a consertá-lo e ainda estou aprendendo o código do método de filtragem dentro do pacote, mas ainda estou confuso onde deve ser consertado 😆

Todos os meus campos de pesquisa estão funcionando agora, mas ainda tenho 1 problema. Com base na demonstração fornecida por yajra (Proprietário), existe o campo Criado em e Atualizado em na tabela. Eu também tenho um campo em minha tabela exibindo data e hora, mas o fato é que, se eu formatei a data e hora exibida de uma forma legível para os usuários, a tabela de dados não conseguiu pesquisar a data e hora recém-formatadas.

Exemplo: (formato padrão de data e hora exibido)
2016-08-23 14:37:25

Eu formatei isso em:
23 DE AGOSTO DE 2016 14:37:25

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

Após a formatação, a tabela de dados não conseguiu pesquisar esse campo

Você pode usar filterColumn api para substituir o sql padrão para pesquisar na coluna de data para corresponder ao que foi exibido.

Para adicionar coluna, deve ser pesquisável.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

alejandri picture alejandri  ·  3Comentários

hohuuhau picture hohuuhau  ·  3Comentários

josiahke picture josiahke  ·  3Comentários

t0n1zz picture t0n1zz  ·  3Comentários

jgatringer picture jgatringer  ·  3Comentários