【发布时间】:2019-08-22 14:08:01
【问题描述】:
我正在使用 yajra laravel 数据表包。
我正在尝试弄清楚如何将这一点控制器代码重构为一个单独的类 (UsersDataTable),我正在使用方法注入使其可访问。这个类扩展了基本的 DataTable 类,但我还没有向这个类添加任何额外的功能。这是我需要帮助理解的。
public function index(Request $request, UsersDataTable $table, UserFilters $requestFilter)
{
$this->authorize('viewList', User::class);
if ($request->ajax()) {
$query = User::with('employment');
$requestFilter->apply($query);
return $table->eloquent($query)
->addColumn('action', 'users.partials.action-cell')
->filterColumn('name', function ($query, $keyword) {
$sql = "CONCAT(users.first_name, ' ', users.last_name) like ?";
$query->whereRaw($sql, ["%{$keyword}%"]);
})
->filterColumn('id', function ($query, $keyword) {
$query->where($query->qualifyColumn('id'), $keyword);
})
->toJson();
}
return view('users.index');
}
<?php
namespace App\DataTables;
use Yajra\DataTables\DataTables;
class UsersDataTable extends DataTables
{
}
<!--begin: Datatable -->
<table id="users_table" data-table="users.index" class="table table-hover"></table>
const table = $('[data-table="users.index"]');
// begin first table
table.DataTable({
ajax: {
url: window.location.href,
data(params) {
params.status = filterData.status;
params.started_at = filterData.started_at;
},
error: function(xhr, error, code) {
console.log(JSON.parse(xhr.responseText.errors));
console.log(xhr);
console.log(error);
new Noty({
type: "error",
layout: "topRight",
text: JSON.parse(xhr.responseText.errors)
}).show();
}
},
columns: [
{ data: "id", title: "User ID" },
{ data: "name", title: "Name" },
{ data: "hometown", title: "Hometown" },
{
data: "employment.started_at",
title: "Date Started",
searchable: false
},
{ data: "status", title: "Status", searchable: false },
{
data: "action",
title: "Action",
orderable: false,
responsivePriority: -1
}
],
initComplete(settings) {
rowCounter.html(`${settings.fnRecordsTotal()} Total`);
}
});
我的预期结果是我的控制器代码可以重构到 UsersDataTable 类的内部。
更新:
我正在处理下面提供给我的内容,但是,我决定将视图与其 API 分开,以获取供表使用的用户集合,因此我不需要使用包创建表.问题是没有运行 dataTable 方法中的代码。我做错了什么?
所以目前作为更新,我有以下内容。
public function index(UsersDataTable $dataTable, UserFilters $requestFilter)
{
$this->authorize('viewList', User::class);
$query = User::query();
$requestFilter->apply($query);
return $dataTable->eloquent($query)->toJson();
}
<?php
namespace App\DataTables;
use App\Models\User;
use App\Filters\UserFilters;
use Yajra\DataTables\DataTables;
class UsersDataTable extends DataTables
{
/** @var userFilters */
private $userFilters;
/**
* UserDataTable constructor.
*
* @param UserFilters $userFilters
*/
public function __construct(UserFilters $userFilters)
{
$this->userFilters = $userFilters;
}
/**
* Build DataTable class.
*
* @param mixed $query Results from query() method.
* @return \Yajra\DataTables\DataTableAbstract
*/
public function dataTable($query)
{
return datatables($query)
->editColumn('started_at', function (User $user) {
return $user->currentEmployment->started_at->format('Y-m-d H:s');
})
->editColumn('name', function (User $user) {
return $user->full_name;
})
->filterColumn('id', function ($query, $keyword) {
$query->where($query->qualifyColumn('id'), $keyword);
})
->filterColumn('name', function ($query, $keyword) {
$sql = "CONCAT(users.first_name, ' ', users.last_name) like ?";
$query->whereRaw($sql, ["%{$keyword}%"]);
})
->addColumn('action', 'users.partials.action-cell');
}
/**
* Get query source of dataTable.
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function query($builder)
{
$query = User::with('employment');
$this->userFilters->apply($query);
return $query;
}
}
【问题讨论】:
-
UserFilters背后的代码是什么? -
您当前是否使用自定义 HTML 和 JavaScript 代码手动渲染您的 DataTable?
-
@Namoshek 我用相关代码更新了我的帖子。 UserFilters 是添加到请求以检索正确数据的范围。
标签: php laravel yajra-datatable