Laravel-datatables: bagaimana cara mencari di kolom yang dihasilkan oleh addColumn?

Dibuat pada 3 Agu 2015  ·  22Komentar  ·  Sumber: yajra/laravel-datatables

Pertama, kerja bagus untuk paket luar biasa ini.

Saya punya masalah kecil:

Saya menambahkan kolom khusus baru di file demo Anda: .../eloquent/add-edit-remove-column, saya ingin mencari/memfilter kolom itu, tetapi saya mendapatkan kesalahan di browser ketika saya memasukkan semuanya.

Apakah ada solusi untuk mencari/memfilter di kolom khusus dan setelah itu menambahkan teks input pencarian untuk setiap kolom dalam tabel, termasuk untuk custom_column?

Kesalahan di konsol FireBug:

  <span class="exception_message">SQLSTATE[42S22]: Column not found: 1054 Champ
 &#039;new_column&#039; inconnu dans where clause (SQL: select count(*) as aggregate from (select &#039
;1&#039; as row_count from `users` where (LOWER(`id`) LIKE %b% or LOWER(`name`) LIKE %b% or LOWER(`email
`) LIKE %b% or LOWER(`created_at`) LIKE %b% or LOWER(`updated_at`) LIKE %b% or LOWER(`new_column`) LIKE
 %b%)) count_row_table)</span>

Kode dari Pengontrol:

    public function getAddEditRemoveColumnData()
    {
        $users = User::select(['id', 'name', 'email', 'password', 'created_at', 'updated_at']);

        return Datatables::of($users)
                                 ->addColumn('new_column' , 'ABC')
                                  ->make(true)
    }

Kode dari Javascript:

    $('#users-table').DataTable({
        processing: true,
        serverSide: true,
        ajax: '{{ url("eloquent/add-edit-remove-column-data") }}',
        columns: [
            {data: 'id', name: 'id'},
            {data: 'name', name: 'name'},
            {data: 'email', name: 'email'},
            {data: 'created_at', name: 'created_at'},
            {data: 'updated_at', name: 'updated_at'},
            {data: 'new_column', custom: 'new_column', orderable: true, searchable: true}
        ]
    });

Komentar yang paling membantu

@marioene , Anda tidak dapat mencari di addColumn jika datanya bukan dari database. Solusi untuk ini adalah menambahkan kolom pada pernyataan pilih Anda seperti di bawah ini. Tidak perlu menggunakan addColumn .

$users = User::select([
'id', 'name', 'email', 'password', 'created_at', 'updated_at',
DB::raw("'ABC' as new_column")
]);

Catatan: Anda mungkin harus menulis filterColumn agar dapat berfungsi. Pastikan sql yang dihasilkan berfungsi dan harus bekerja dengan paket juga.

Semua 22 komentar

@marioene , Anda tidak dapat mencari di addColumn jika datanya bukan dari database. Solusi untuk ini adalah menambahkan kolom pada pernyataan pilih Anda seperti di bawah ini. Tidak perlu menggunakan addColumn .

$users = User::select([
'id', 'name', 'email', 'password', 'created_at', 'updated_at',
DB::raw("'ABC' as new_column")
]);

Catatan: Anda mungkin harus menulis filterColumn agar dapat berfungsi. Pastikan sql yang dihasilkan berfungsi dan harus bekerja dengan paket juga.

Penutupan karena tidak aktif dan solusi yang disarankan di atas akan memperbaiki masalah. Terima kasih!

@yajra Saya mengikuti saran Anda untuk terlebih dahulu menambahkan kolom terhitung menggunakan 'pilih' (di Pengontrol)

$staffData = Staff::select('id', 'staff_id', \DB::raw('concat(first_name, " ", middle_name, " ", last_name) as full_name'), 'department_name', 'status');

Kemudian saya menambahkan filter khusus (di Controller)

$dt = Datatables::of($staffData);
return $dt->filterColumn('full_name', function($query, $keyword) {
            $query->whereRaw("CONCAT(first_name, ' ', middle_name, ' ', last_name) like ?", ["%{$keyword}%"]);
        })->make(true);

Ketika saya pertama kali memuat halaman, tabel data dirender dengan benar ketika saya melakukan pencarian menggunakan kotak teks input pencarian global, terjadi kesalahan

Ajax error. http://datatables.net/tn/7

Bisakah Anda memberi tahu saya di mana saya mungkin membuat kesalahan.

@AshishGupta001 coba

@yajara Terima kasih atas tanggapan cepat Anda.
Saat menerapkan pencarian global untuk kolom 'dihitung' (dalam kasus saya 'nama_lengkap'), saya merujuk ke
1) Edisi 168 : https://github.com/yajra/laravel-datatables/issues/168
2) Contoh: https://datatables.yajrabox.com/eloquent/post-column-search

Sebelum saya menambahkan 'filterColumn()' khusus untuk datatable saya, saya mendapatkan pengecualian SQL yang mengeluhkan kolom 'full_name' yang hilang di tabel. Kemudian saya menambahkan kode di bawah ini untuk menambahkan filter khusus untuk kolom 'dihitung' (dalam kasus saya 'nama_lengkap') seperti di bawah ini

$dt->filterColumn('full_name', function($query, $keyword) {
       $query->whereRaw("CONCAT(staff.first_name, ' ', staff.middle_name, ' ', staff.last_name) like ?", ["%{$keyword}%"]);
});

return $dt->make(true);

Sekarang saya mendapatkan kesalahan berikut di log

mb_strtolower() expects parameter 1 to be string, object given dalam file ......./vendor/laravel/framework/src/Illuminate/Support/Str.php#162

Hargai jika Anda dapat membantu men-debug masalah ini.

@AshishGupta001 versi apa yang Anda gunakan? Kode Anda terlihat bagus bagi saya.

@yajra Terima kasih atas konfirmasinya. Versi seperti di bawah ini

PHP - 5.5.38-3
Laravel - 5.0.34
Datatables - yajra/laravel-datatables-Oracle: ^6.3 (seperti pada composer.json)

Tampaknya di 'getOrMethod' di kelas Helper, pengecualian dilemparkan saat mencoba mengonversi untuk menurunkan "clouser" yang diteruskan sebagai param input.

public static function getOrMethod($method) {
   if (! Str::contains(Str::lower($method), 'or')) {
      return 'or' . ucfirst($method);
   }
      return $method;
}

'$method' adalah clouser yang diteruskan function($query, $keyword) , seperti di bawah ini

Closure {#864
  reflection: """
    Closure [ <user> public method App\Http\Controllers\{closure} ] {\n
      @@ /var/www/html/XYZ/app/Http/Controllers/StaffHistoryController.php 310 - 313\n
    \n
      - Parameters [2] {\n
        Parameter #0 [ <required> $query ]\n
        Parameter #1 [ <required> $keyword ]\n
      }\n
    }\n
    """
}

Meskipun saya tidak dapat menemukan masalah yang saya hadapi, saya dapat menemukan jalan keluar dari kasus penggunaan khusus ini. Terima kasih atas petunjuk yang tersedia di sini.

Lihat: Miliki yang berikut ini di Tampilan di dalam tag skrip

{ data: 'full_name', name: 'full_name', searchable: false },
{ data: 'first_name', name: 'first_name', searchable: true, visible: false },
{ data: 'middle_name', name: 'middle_name', searchable: true, visible: false },
{ data: 'last_name', name: 'last_name', searchable: true, visible: false }

Pengontrol: Ambil first_name dll dalam kueri SQL bersama dengan nilai kolom lainnya.

@AshishGupta001 senang Anda mengetahuinya. Itu juga yang saya lakukan sejak Laravel versi 4.2. 👍

@AshishGupta001 Solusi yang bagus!

@yajra Bisakah kita mencari kolom yang ditambahkan menggunakan addColumn yang datanya berasal dari database tetapi kita tidak menambahkan kolom ini di JS?

Atau kita harus menambahkannya ke JS dan membuatnya tidak terlihat tetapi dapat dicari ?

Beberapa cara yang bisa saya pikirkan:

  1. Tambahkan ke js dan buat itu tidak terlihat dan dapat dicari seperti yang Anda katakan.
  2. Gunakan filterColumn untuk menangani pencarian kolom yang ditambahkan secara manual.
  3. Nyatakan dengan cara ini:
{data: 'added_column', name: 'actual_column_name'}

Terima kasih atas tanggapan cepat Anda @yajra

Saya sudah mencoba solusi kedua tetapi saya perhatikan kolom yang ditambahkan ini tidak dipertimbangkan dalam kueri.

Ada pikiran?

Pastikan Anda tidak menambahkan searchable: false pada kolom tersebut.

Ini adalah bagaimana saya menambahkan kolom ->addColumn('company_name', function($deal) { return $deal->company_name; })

Dan permintaan pencarian global sebagai $dataTable->filterColumn('company_name', 'where', "like", ["%$keyword%"]);

Bisakah kita melewati searchable: false di backend?

searchable: false ada di js sisi klien.

btw, agan pake versi apa?

Oke. Jadi kita masih perlu menggunakan cara pertama yang Anda sebutkan, dengan cara ini.
Saya menggunakan v6.17.0

Saya mengalami masalah yang sama dengan @AshishGupta001 sayangnya trik sisi klien tidak memotongnya karena kolom tidak dapat diurutkan.
Saya telah menjelajahi alternatif filterColumn tetapi tidak dapat membuatnya berfungsi juga.
menggunakan "yajra/laravel-datatables-Oracle": "~9.0"

metode pengontrol:

    public function getAccounts(Request $request)
    {
        if ($request->ajax()) {
            $accounts = Account::with('current_marketer')->select([
                '*',
                DB::raw("CONCAT(accounts.lastname,' ',accounts.firstname) as fullname"),
            ]);
            return Datatables::of(Account::query()->with('current_marketer'))
            ->addColumn('marketer', function(Account $account){
                return $account->current_marketer->name;
            })
            ->addColumn('fullname', function($account){
                return '<a href="'.route('account.clients.show', $account->account_number).'" class="hover:underline" target="_blank">'. $account->fullname.'</a>';
            })
            ->filterColumn('fullname', function($query, $keyword) {
                $sql = "CONCAT(accounts.lastname,' ',accounts.firstname)  like ?";
                $$query->whereRaw($sql, ["%{$keyword}%"]);
            })
            ->rawColumns(['fullname'])
            ->editColumn('created_on', function(Account $account) {
                return Carbon::parse($account->created_on)->format('jS F, Y');
            })
            ->toJson();
        }
        return view('datatables.accounts.index');
    }

pisau js:

 $('#accounts-table').DataTable({
          "processing": true,
          "serverSide": true,
          "ajax": '{{ route('accounts.get') }}',
          "columns": [
            { data: "id" },
            { data: "account_number" },
            { data: 'fullname'},
            { data: "marketer" },
            { data: "created_on" },
          ]
        });

Pengecualian: ketika pencarian atau pengurutan dicoba:

yajraIssue

ternyata masalah dengan pengecualian itu adalah kesalahan saya; Saya memiliki tanda '$$' ganda dalam metode filterColumn saya.
yajra_issue_fix_1

Itu tidak memperbaiki masalah penyortiran saya. Saya masih perlu tahu:

  1. cara membuat kolom dapat diurutkan
  2. cara mencari dan mengurutkan kolom terkait, lihat dokumen lain, bersihkan ini untuk kasus penggunaan saya

@ seewhy17 Anda dapat menggunakan orderColumn untuk penyortiran yang kompleks. Namun dalam kasus Anda, memesan dengan fullname sudah akan bekerja di luar kotak afaik.

@ seewhy17 Anda dapat menggunakan orderColumn untuk penyortiran yang kompleks. Namun dalam kasus Anda, memesan dengan fullname sudah akan bekerja di luar kotak afaik.

Yah tidak, saya kira metode filterColumn bertentangan dengan Penilai pada Model yang pada dasarnya melakukan hal yang sama ... Saya benar-benar tidak tahu.
Untuk tahu saya membuatnya bekerja dengan menambahkan name: lastname ke js, jadi filter dengan nama belakang dan metode filterColumn berlebihan

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

jackrsantana picture jackrsantana  ·  3Komentar

sangnguyenplus picture sangnguyenplus  ·  3Komentar

josiahke picture josiahke  ·  3Komentar

SGarridoDev picture SGarridoDev  ·  3Komentar

hohuuhau picture hohuuhau  ·  3Komentar