服务器端 Yajra 数据表列:[] 操作
Server-side Yajra datatable columns:[] manipulation
我想操纵 yajra 数据tables
columns:[
{ data: 'fname', name: 'members.fname' },
{ data: 'fname', name: 'employees.emp_fname' }
]
使用如下所示的渲染功能,但没有成功。 return 语句中有错误。 table 不呈现任何数据。我只是找不到合适的解决方法。我已经使用了 alias
和 addColumn
并且效果很好,但问题是它不允许搜索名称。这就是我想出这种代码行的原因,因为它可能允许搜索它是否有效。请帮忙解决这个问题。谢谢。
p3bills_table = $('#table-p3bills').DataTable({
processing: true,
serverSide: true,
order: [
[
1, "asc"
]
],
ajax: {
url: "{{ route('get.p3bills') }}",
},
columns: [
{ data:'id', name:'p3bills.id' },
{ data:'id', name:'p3bills.id', orderable: true },
{ data:'p3loan_id', name:'p3loan_id' },
{ data:'schedule', name:'p3bills.schedule' },
{
render: function (data, type, full, meta) {
if (full.member_id == 0) {
return data:'fname', name: 'employees.emp_fname';
} else {
return data:'fname', name: 'members.fname';
}
}
},
{ data:'lname', name:'members.lname' },
{ data:'mname', name:'members.mname' }
]
});
控制器
public function getP3bills(){
$p3bills = P3bill::leftJoin('p3payments', 'p3payments.p3bill_id', '=', 'p3bills.id')
->leftJoin('members', 'members.id', '=', 'p3bills.member_id')
->leftJoin('employees', 'employees.id', '=', 'p3bills.employee_id')
->select(['members.id','members.lname','members.fname','members.mname','members.extension','employees.id','employees.emp_lname','employees.emp_fname','employees.emp_mname','employees.emp_extension','p3bills.*','p3payments.payment_amount','p3payments.or_number'])
->selectRaw( '('.
'CASE'.
' WHEN members.id=0 THEN employees.emp_fname'.
' ELSE members.fname'.
' END'.
') AS person_name' );
}
您需要在后端处理这种情况。
我假设您正在使用 Yajra DataTables service implementation。
您可以使用 CASE
语句来根据您的条件确定返回的内容。
例如:
/**
* Get query source of dataTable.
*
* @param \App\Models\User $model
* @return \Illuminate\Database\Eloquent\Builder
*/
public function query(User $model)
{
$query = $model->newQuery()
->select()
->selectRaw(
'('.
'CASE'.
' WHEN members.id=0 THEN employees.emp_fname'.
' ELSE members.fname'.
' END'.
') AS person_name'
);
return $query;
}
要在此新列上启用搜索,您需要调用 filterColumn()
方法。
根据您的 Laravel DataTables 版本和选择的实现方法,您的代码可能会有所不同。例如,下面的代码适用于使用服务实现的 Laravel DataTables v9。
/**
* Build DataTable class.
*
* @param mixed $query Results from query() method.
* @return \Yajra\DataTables\DataTableAbstract
*/
public function dataTable($query)
{
return datatables($query)
->filterColumn('person_name', function($query, $keyword) {
$query->whereRaw(
'('.
'CASE'.
' WHEN members.id=0 THEN employees.emp_fname'.
' ELSE members.fname'.
' END'.
') ILIKE ?',
[ '%' . sql_escape_like($keyword) . '%' ]
);
});
}
此外,我正在使用以下辅助方法来转义 LIKE
/ ILIKE
子句中的特殊字符。
if (! function_exists('sql_escape_like')) {
/**
* Escape special characters for SQL query with LIKE condition.
*
* @param string $value
* @return string
*/
function sql_escape_like($value)
{
return str_replace(['\', '%', '_'], ['\\', '\%', '\_'], $value);
}
}
然后在 JavaScript DataTables 初始化代码中使用 { data:'person_name' }
作为列定义。
按照的建议,检查控制器中的状态并渲染
使用伪列的元素。在控制器中你可以这样做,
$bills = Bill::all(); // Your Model Query goes here
return datatables($bills)
->addColumn('fname', function ($bill) {
if ($bill->member_id == 0) {
return $bill->employee->fname; // Employee First Name
}
return $bill->member->fname; // Member First Name
})
->toJson();
在 JavaScript 中,您可以将其用作,
{ data: 'fname' }
我想操纵 yajra 数据tables
columns:[
{ data: 'fname', name: 'members.fname' },
{ data: 'fname', name: 'employees.emp_fname' }
]
使用如下所示的渲染功能,但没有成功。 return 语句中有错误。 table 不呈现任何数据。我只是找不到合适的解决方法。我已经使用了 alias
和 addColumn
并且效果很好,但问题是它不允许搜索名称。这就是我想出这种代码行的原因,因为它可能允许搜索它是否有效。请帮忙解决这个问题。谢谢。
p3bills_table = $('#table-p3bills').DataTable({
processing: true,
serverSide: true,
order: [
[
1, "asc"
]
],
ajax: {
url: "{{ route('get.p3bills') }}",
},
columns: [
{ data:'id', name:'p3bills.id' },
{ data:'id', name:'p3bills.id', orderable: true },
{ data:'p3loan_id', name:'p3loan_id' },
{ data:'schedule', name:'p3bills.schedule' },
{
render: function (data, type, full, meta) {
if (full.member_id == 0) {
return data:'fname', name: 'employees.emp_fname';
} else {
return data:'fname', name: 'members.fname';
}
}
},
{ data:'lname', name:'members.lname' },
{ data:'mname', name:'members.mname' }
]
});
控制器
public function getP3bills(){
$p3bills = P3bill::leftJoin('p3payments', 'p3payments.p3bill_id', '=', 'p3bills.id')
->leftJoin('members', 'members.id', '=', 'p3bills.member_id')
->leftJoin('employees', 'employees.id', '=', 'p3bills.employee_id')
->select(['members.id','members.lname','members.fname','members.mname','members.extension','employees.id','employees.emp_lname','employees.emp_fname','employees.emp_mname','employees.emp_extension','p3bills.*','p3payments.payment_amount','p3payments.or_number'])
->selectRaw( '('.
'CASE'.
' WHEN members.id=0 THEN employees.emp_fname'.
' ELSE members.fname'.
' END'.
') AS person_name' );
}
您需要在后端处理这种情况。
我假设您正在使用 Yajra DataTables service implementation。
您可以使用 CASE
语句来根据您的条件确定返回的内容。
例如:
/**
* Get query source of dataTable.
*
* @param \App\Models\User $model
* @return \Illuminate\Database\Eloquent\Builder
*/
public function query(User $model)
{
$query = $model->newQuery()
->select()
->selectRaw(
'('.
'CASE'.
' WHEN members.id=0 THEN employees.emp_fname'.
' ELSE members.fname'.
' END'.
') AS person_name'
);
return $query;
}
要在此新列上启用搜索,您需要调用 filterColumn()
方法。
根据您的 Laravel DataTables 版本和选择的实现方法,您的代码可能会有所不同。例如,下面的代码适用于使用服务实现的 Laravel DataTables v9。
/**
* Build DataTable class.
*
* @param mixed $query Results from query() method.
* @return \Yajra\DataTables\DataTableAbstract
*/
public function dataTable($query)
{
return datatables($query)
->filterColumn('person_name', function($query, $keyword) {
$query->whereRaw(
'('.
'CASE'.
' WHEN members.id=0 THEN employees.emp_fname'.
' ELSE members.fname'.
' END'.
') ILIKE ?',
[ '%' . sql_escape_like($keyword) . '%' ]
);
});
}
此外,我正在使用以下辅助方法来转义 LIKE
/ ILIKE
子句中的特殊字符。
if (! function_exists('sql_escape_like')) {
/**
* Escape special characters for SQL query with LIKE condition.
*
* @param string $value
* @return string
*/
function sql_escape_like($value)
{
return str_replace(['\', '%', '_'], ['\\', '\%', '\_'], $value);
}
}
然后在 JavaScript DataTables 初始化代码中使用 { data:'person_name' }
作为列定义。
按照
$bills = Bill::all(); // Your Model Query goes here
return datatables($bills)
->addColumn('fname', function ($bill) {
if ($bill->member_id == 0) {
return $bill->employee->fname; // Employee First Name
}
return $bill->member->fname; // Member First Name
})
->toJson();
在 JavaScript 中,您可以将其用作,
{ data: 'fname' }