<?php namespace App\Utils; use Illuminate\Contracts\Pagination\LengthAwarePaginator; use Illuminate\Http\Request; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder; use Symfony\Component\HttpFoundation\BinaryFileResponse; use function in_array; class RequestSearchQuery { /** * @var Request */ private $request; /** * @var Builder */ private $query; public function __construct(Request $request, Builder $query, $searchables = []) { $this->request = $request; $this->query = $query; $this->initializeQuery($searchables); } private function getLocalizedColumn(Model $model, $column) { if (property_exists($model, 'translatable') && in_array($column, $model->translatable, true)) { $locale = app()->getLocale(); return "$column->$locale"; } return $column; } /** * @param array $searchables */ public function initializeQuery($searchables = []) { $model = $this->query->getModel(); if ($column = $this->request->get('column')) { $this->query->orderBy( $this->getLocalizedColumn($model, $column), $this->request->get('direction') ?? 'asc' ); } if ($search = $this->request->get('search')) { $this->query->where(function (Builder $query) use ($model, $searchables, $search) { foreach ($searchables as $key => $searchableColumn) { $query->orWhere( $this->getLocalizedColumn($model, $searchableColumn), 'like', "%{$search}%" ); } }); } } /** * @param $columns * * @return LengthAwarePaginator */ public function result($columns) { return $this->query->paginate($this->request->get('perPage'), $columns); } /** * @param $columns * @param array $headings * @param $fileName * * @return BinaryFileResponse */ public function export($columns, array $headings, $fileName) { $currentDate = date('dmY-His'); return Excel::download( new DataTableExport($headings, $this->query, $columns), "$fileName-export-$currentDate.xlsx" ); } }