问题描述
我正在使用 Laravel 和 yajrabix/laravel-datatables 进行一个项目。尝试使用 columndefs 访问列时遇到问题。该列应该是 JSON 数据。没有任何东西可以处理该列中的数据。有没有办法发送该列的未修改数据?
最重要的是,我希望能够从存储在结果列中的 json 访问数据。无论我做什么,它都不起作用。
这是我的刀片视图中的代码。其他一切都适用于数据表。
<script type="text/javascript">
$(function () {
var table = $('.table').DataTable({
processing: true,serverSide: false,ajax: "/admin/logs/datatable/lookup-ip",columns: [
{data: 'id',name: 'id'},{data: 'ip_address',name: 'ip_address'},{data: 'results',name: 'results'},{data: 'created_by',name: 'created_by'},{data: 'created_at',name: 'created_at'},],columnDefs: [
{
targets: "_all",className: 'nk-tb-col tb-col-mb'
},{
targets: 2,render: function (data,type,row,Meta) {
return 'ISP: ' + data.ip;
}
}
],});
});
</script>
这是为数据表提供服务的控制器中的函数。
public function datatable($log)
{
switch($log)
{
case 'activity':
$table = config('activitylog.table_name');
break;
case 'lookup-ip':
$table = IPLookup::getModel()->getTable();
break;
case 'lookup-phone':
$table = PhoneLookup::getModel()->getTable();
break;
}
$query = DB::table($table);
return DataTables::of($query)->toJson();
}
这是存储在数据库中的数据。
{"ip": "8.8.8.8","asn": "AS15169","isp": "Google LLC","org": "Google LLC","city": "Ashburn","type": "IPv4","region": "Virginia","country": "United States","success": true,"currency": "US Dollar","latitude": "39.0437567","timezone": "America/New_York","continent": "north America","longitude": "-77.4874416","country_code": "US","country_flag": "https://cdn.ipwhois.io/flags/us.svg","timezone_gmt": "GMT -5:00","country_phone": "+1","currency_code": "USD","timezone_name": "Eastern Standard Time","continent_code": "NA","currency_rates": "1","country_capital": "Washington","currency_plural": "US dollars","currency_symbol": "$","completed_requests": 29,"country_neighbours": "CA,MX,CU","timezone_dstOffset": "0","timezone_gmtOffset": "-18000"}
IP 日志的模型已经投射设置。
protected $casts = [
'results' => 'array',];
解决方法
好的,所以它在发布问题后计算......我明白了。
根据 yajrabox 的说法: 默认情况下,Laravel DataTables 通过转义我们的所有输出来保护我们免受 XSS 攻击。如果您想呈现 html 内容,请使用 rawColumns api。
所以我修改了返回数据表的控制器中的代码,现在它按预期工作,我可以解析 JSON 并将其用作 javascript 中的对象。
return DataTables::of($query)
->rawColumns(['results'])
->toJson();
,
我注意到的一件事是,根据您的示例,存储在您的数据库中的数据没有包含在数组括号 (Total
) 中,并且您在模块上使用了强制转换。这可能是问题的原因。
尝试转到您的数据库并手动将您的 JSON 包装在数组括号中并试一试!