数据表 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 个结果。