数据表 filterColumn 似乎不起作用
Datatables filterColumn doesnt seem to work
有这个代码:
$campaigns = CampaignMembers::with(['company', 'note'])
->select(['*', DB::raw('count(*) as count')])
->where('campaign_id', $campaign_id)
->havingRaw('count = ?', [42])
->groupBy('customer_id');
return DataTables::of($campaigns)
->filterColumn('count', function($q, $kw) {
$q->select(['*', DB::raw('count(*) as count')])
->where('campaign_id', 8)
->havingRaw('count = ?', [42])
->groupBy('customer_id');
})
->addColumn('show', '<a href="/showCampaignCompany/{{$customer_id}}"><i class="material-icons">visibility</i></a>')
->addColumn('edit', '<a href="/editCustomer/{{$id}}"><i class="material-icons">edit</i></a>')
->addColumn('delete', '<a href="#" data-id="{{$id}}" class="deleteTemplate"><i class="material-icons">delete</i></a>')
->rawColumns(['show', 'edit', 'delete'])
->make(true);
为了使 count(*)
结果可搜索,我添加了对 filterColumn()
的调用以执行该自定义搜索,因为不支持在别名列中进行搜索。问题是 filterColumn()
结果似乎被忽略了。由于我对计数值进行了硬编码,因此我希望始终收到相同的结果。但我反而收到了新的。过滤的结果。我想念什么?
使用最新的 yajra 数据tables 9.19
编辑一些关系信息:
CampaignMembers 模型有一个 customer_id。客户table可以是公司也可以是自然人。谈论关系并不重要,因为我使用 customer_id 对所有内容进行分组,这是一个“本地”列,即使稍后,我通过关系获取公司或个人的名称。该计数来自 CampaignMembers table。它计算找到相同 customer_id 的次数。简单。
好了3天后,我设法解决了它。我将结果连接成一列以使 table 更清晰。该解决方案感觉非常复杂,但效果很好。当然会有性能损失:
首先我在模型中创建了一个自定义属性:
protected $appends = ['customer_count'];
public function getCustomerCountAttribute()
{
return $this->company->name . '(' .$this->where('customer_id', $this->customer_id)->count() . ')';
}
公司名称位于关系中,所以我在 table 的 javascript 声明中这样做了:
{data: 'customer_count', name: 'company.name'},
那么,在controller中,ajax调用的函数是这样的:
$campaigns = CampaignMembers::with(['company', 'note'])
->where('campaign_id', $campaign_id)
->groupBy('customer_id')
->select('campaign_members.*');
return DataTables::of($campaigns)
->filterColumn('company.name', function($q, $kw) use($campaigns){
$countIds = $campaigns->get()->filter(function($item) use ($kw) {
if(Str::contains($item->customer_count, $kw))
return $item->customer_count;
})->pluck('id');
$q->whereHas('company', function ($query) use ($kw) {
return $query->where('name', 'LIKE', "%$kw%");
})->orWhereIn('campaign_members.id', $countIds);
})->toJson();
这样,即使搜索 部分匹配 计数或公司名称,两者都有 return 个结果。
有这个代码:
$campaigns = CampaignMembers::with(['company', 'note'])
->select(['*', DB::raw('count(*) as count')])
->where('campaign_id', $campaign_id)
->havingRaw('count = ?', [42])
->groupBy('customer_id');
return DataTables::of($campaigns)
->filterColumn('count', function($q, $kw) {
$q->select(['*', DB::raw('count(*) as count')])
->where('campaign_id', 8)
->havingRaw('count = ?', [42])
->groupBy('customer_id');
})
->addColumn('show', '<a href="/showCampaignCompany/{{$customer_id}}"><i class="material-icons">visibility</i></a>')
->addColumn('edit', '<a href="/editCustomer/{{$id}}"><i class="material-icons">edit</i></a>')
->addColumn('delete', '<a href="#" data-id="{{$id}}" class="deleteTemplate"><i class="material-icons">delete</i></a>')
->rawColumns(['show', 'edit', 'delete'])
->make(true);
为了使 count(*)
结果可搜索,我添加了对 filterColumn()
的调用以执行该自定义搜索,因为不支持在别名列中进行搜索。问题是 filterColumn()
结果似乎被忽略了。由于我对计数值进行了硬编码,因此我希望始终收到相同的结果。但我反而收到了新的。过滤的结果。我想念什么?
使用最新的 yajra 数据tables 9.19
编辑一些关系信息:
CampaignMembers 模型有一个 customer_id。客户table可以是公司也可以是自然人。谈论关系并不重要,因为我使用 customer_id 对所有内容进行分组,这是一个“本地”列,即使稍后,我通过关系获取公司或个人的名称。该计数来自 CampaignMembers table。它计算找到相同 customer_id 的次数。简单。
好了3天后,我设法解决了它。我将结果连接成一列以使 table 更清晰。该解决方案感觉非常复杂,但效果很好。当然会有性能损失:
首先我在模型中创建了一个自定义属性:
protected $appends = ['customer_count'];
public function getCustomerCountAttribute()
{
return $this->company->name . '(' .$this->where('customer_id', $this->customer_id)->count() . ')';
}
公司名称位于关系中,所以我在 table 的 javascript 声明中这样做了:
{data: 'customer_count', name: 'company.name'},
那么,在controller中,ajax调用的函数是这样的:
$campaigns = CampaignMembers::with(['company', 'note'])
->where('campaign_id', $campaign_id)
->groupBy('customer_id')
->select('campaign_members.*');
return DataTables::of($campaigns)
->filterColumn('company.name', function($q, $kw) use($campaigns){
$countIds = $campaigns->get()->filter(function($item) use ($kw) {
if(Str::contains($item->customer_count, $kw))
return $item->customer_count;
})->pluck('id');
$q->whereHas('company', function ($query) use ($kw) {
return $query->where('name', 'LIKE', "%$kw%");
})->orWhereIn('campaign_members.id', $countIds);
})->toJson();
这样,即使搜索 部分匹配 计数或公司名称,两者都有 return 个结果。