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
'new_column' inconnu dans where clause (SQL: select count(*) as aggregate from (select '
;1' 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}
]
});
@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:
{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:
ternyata masalah dengan pengecualian itu adalah kesalahan saya; Saya memiliki tanda '$$' ganda dalam metode filterColumn saya.
Itu tidak memperbaiki masalah penyortiran saya. Saya masih perlu tahu:
@ 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
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 menggunakanaddColumn
.