Skip to content

Unable to use FilterColumn with DB::raw #90

@zainabideengeeko

Description

@zainabideengeeko
public function dataTable(QueryBuilder $query, Request $request): EloquentDataTable
    {
        return (new EloquentDataTable($query))
            ->addColumn('title',fn($query) => "$query->makeTitle $query->makeModelTitle  $query->year")
            ->addColumn('body type',fn($query) => $query->bodyTypeTitle)
            ->addColumn('price', fn($query) => $query->price)
            ->addColumn('image', function($query) {
                $image = asset($query->getFirstMediaUrl('featured_image'));
                return '<img src="'.$image.'" alt="user-image" class="rounded-circle"
                    style="height: 50px;width: 50px;object-fit: cover;">';
            })
            ->addColumn('active',function($query){
                $checked = $query->is_active ? "checked" : "";
                $switcherRoute = route('cars.toggle',$query->id);
                $csrfToken = csrf_token();
                $switcher = '
                    <form action="'.$switcherRoute. '" method="post">
                        <label class="switch">
                            <input type="hidden" name="_token" value="'.$csrfToken.'">
                            <input type="hidden" name="_method" value="PATCH">
                            <input type="checkbox" id="carActivation'.$query->id.'" class="switch-input" '. $checked .' data-car-id="'.$query->id. '" onclick="carActivation(this,'.$query->id.',this.checked)"/>
                            <span class="switch-toggle-slider">
                                <span class="switch-on">
                                    <i class="bx bx-check"></i>
                                </span>
                                <span class="switch-off">
                                    <i class="bx bx-x"></i>
                                </span>
                            </span>
                            <span class="switch-label">Active</span>
                        </label>
                    </form>
                ';

                return $switcher;
            })
            ->addColumn('created',fn($query) => date('Y-m-d', strtotime($query->created_at)))
            ->addColumn('bookings',fn($query) => $query->booking_count)
            ->addColumn('actions',function($query){
                $showRoute = route("cars.show", $query->id);
                $show = '<button class="btn btn-sm btn-icon show-record">
                    <a href="'.$showRoute.'">
                        <i class="fa fa-eye"></i>
                    </a>
                </button>';

                $editRoute = route('cars.edit', $query->id);
                $edit = '<button class="btn btn-sm btn-icon edit-record">
                    <a href="'.$editRoute.'">
                        <i class="fa fa-edit"></i>
                    </a>
                </button>';

                $delete = '<button class="btn btn-sm btn-icon delete-record" type="submit" style="color: #5a8dee" data-bs-toggle="modal" data-bs-target="#enableOTPCar'. $query->id.'">
                    <i class="fa fa-trash"></i>
                </button>';
                $deleteRoute = route('cars.destroy',$query->id);
                $include = view('_partials.deleteModal',[
                    'id' => 'Car'.$query->id,
                    'title' => 'Delete car',
                    'msg' => "Are you sure about deleting {$query->make->title} {$query->makeModel->title} {$query->year}",
                    'form_action' => $deleteRoute
                ]);

                return $show . $edit . $delete . $include;
            })
            ->rawColumns(['image','actions','active'])
            ->filterColumn('bookings', function($query, $keyword) {
              $keywords = trim($keyword);
              $query->havingRaw("COUNT(bookings.id) AS booking_count = ?", ["{$keywords}"]);
            })
            ->orderColumn('title', function ($query, $order) {
                $query->orderBy('makeTitle', $order);
            })
            ->orderColumn('body type', function ($query, $order) {
                $query->orderBy('bodyTypeTitle', $order);
            })
            ->orderColumn('price', function ($query, $order) {
                $query->orderBy('price', $order);
            })
            ->filter(
                fn ($query) =>
                $query->when(
                    $request->search['value'] ?? false, fn($query) =>
                        $query->where('year', 'like', '%' . $request->search['value'] . '%')
                        ->orWhere('price', 'like', '%' . $request->search['value'] . '%')
                        ->orWhere('cars.created_at', 'like', '%' . $request->search['value'] . '%')
                        // Relations
                        ->orWhereHas('make', fn ($query) =>
                            $query->where('title', 'like', '%' . $request->search['value'] . '%')
                        )
                        ->orWhereHas('makeModel', fn ($query) =>
                            $query->where('title', 'like', '%' . $request->search['value'] . '%')
                        )
                        ->orWhereHas('bodyType', fn ($query) =>
                            $query->where('title', 'like', '%' . $request->search['value'] . '%')
                        )
                )
            )
            ->setRowId('id');
    }
    
    public function query(Car $model): QueryBuilder
    {
      $selectColumns = [
        'cars.id',
        'makes.title as makeTitle',
        'body_types.title as bodyTypeTitle',
        'price_packages.price as price',
        'cars.make_id',
        'cars.is_active',
         DB::raw('COUNT(bookings.id) AS booking_count'),
        'cars.created_at',
        'make_models.title as makeModelTitle',
        'cars.make_model_id',
        'cars.body_type_id',
        'cars.price_plan_id',
        ];



        $query = $model->select($selectColumns)->join('makes','makes.id','=','cars.make_id')
                                            ->join('make_models','make_models.id','=','cars.make_model_id')
                                            ->join('body_types','body_types.id','=','cars.body_type_id')
                                            ->join('price_plans','price_plans.id','=','cars.price_plan_id')
                                            ->join('bookings','bookings.car_id','=','cars.make_model_id')
                                            ->leftJoin('price_packages',fn($join) =>
                                                                        $join->on('price_packages.price_plan_id','=','price_plans.id')
                                                                        ->where('price_packages.title','default')
                                                                    )
          ->groupBy('cars.id', 'makes.title', 'body_types.title', 'price_packages.price', 'cars.make_id', 'cars.is_active', 'cars.created_at', 'make_models.title', 'cars.make_model_id', 'cars.body_type_id', 'cars.price_plan_id');
        if(auth()->user()->hasRole('shop')){
            $query->where('cars.shop_id',auth()->user()->shop_id);
        }
//      dd($query->toSql());
        return $query;
    }

image
Help to get out of this issue.
I'm using individual column search, the filter column is not working with DB::raw.
These are the versions
"yajra/laravel-datatables": "9.0",
"yajra/laravel-datatables-oracle": "^10.0"

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions