如何在Yajra数据表中将两列合并为一列



我想将餐厅名称和位置合并到一列中,我使用laravel,我不想使用控制器中的editcolumn进行合并,因为这不允许搜索工作,我会遇到麻烦,因为我在这里使用了雄辩的解释https://github.com/yajra/laravel-datatables/issues/2293所以我必须返回与elquent相同的名称,但我需要同时在一个中组合两列

请注意,我不能在控制器中使用组合并在一列中返回

->editColumn('restaurant_name', function ($data) {
return $data->restaurant_name.' - '.$data->restaurant_city;
}) //this one cant be work because it will give me error message when do search

Javascript:

columns: [
{data: 'id', name: 'id', sClass: 'text-center'},
{data: 'user_name', name: 'users.name', sClass: 'text-center'},
{data: 'restaurant_name', name: 'restaurants.name', sClass: 'text-center'},
{data: 'restaurant_city', name: 'locations.city', sClass: 'text-center'},
{data: 'action', name: 'action', sClass: 'text-center',orderable: false, searchable: false},
],

控制器

return $this->select('orders.*', 'users.name')
->join("food_orders", "orders.id", "=", "food_orders.order_id")      
->join("foods", "foods.id", "=", "food_orders.food_id")
->join("restaurant_locations", "restaurant_locations.id", "=", "orders.location_id")
->join("restaurants", "restaurants.id", "=", "foods.restaurant_id")
->join('users', 'orders.user_id', '=', 'users.id')
->select('orders.*',"users.name as user_name","restaurants.name as restaurant_name","restaurant_locations.city as restaurant_city")
->groupBy('orders.id');

return  DataTables::of(Order::GetAllOrders())
->addIndexColumn()          
->editColumn('created_at', function ($data) {
return date('d-m-Y', strtotime($data->updated_at));
})
->addColumn('action', function($row){
return  view('admin.orders.all_orders.action-buttons',compact('row'))->render();
})
->rawColumns(['action'])
->make(true);

我认为应该使用addColumn而不是editColumn来显示合并名称:

->addColumn('full_restaurant_name', function ($data) {
$data->restaurant_name.' - '.$data->restaurant_city
});

通过这样做,您不是在更改现有列restaurant_name,而是在添加另一个字段。现在,如果你想让这个专栏保持可搜索性,你可以做两件事:

  1. 添加自定义筛选器
  2. 如下定义新的full_restaurant_name列:

{data: 'full_restaurant_name', name: 'restaurant_name'}

这样,搜索将在full_restaurant_name上工作,因为它在数据库中被称为restaurant_name列。

附言:我还没有测试过,所以如果你遇到任何问题,请告诉我

尝试使用自定义过滤器https://datatables.yajrabox.com/collection/custom-filter

这可能会对您有所帮助:

DataTables::of(Order::GetAllOrders())
->addIndexColumn()
->filterColumn('restaurant_name', function($query, $keyword) {
$query->where('restaurant_name', 'like', "%{$keyword}%")
->orWhere('restaurant_city', 'like', "%{$keyword}%"); // you can implement any logic you want here
})
->editColumn('restaurant_name', function ($data) {
return $data->restaurant_name.' - '.$data->restaurant_city;
})
...;

最新更新