deniskoronets/Laravel-GridView

View on GitHub
src/DataProviders/EloquentDataProvider.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php

namespace Woo\GridView\DataProviders;

use Illuminate\Database\Eloquent\Builder;
use Woo\GridView\Exceptions\GridViewConfigException;
use Woo\GridView\GridViewRequest;

class EloquentDataProvider extends BaseDataProvider
{
    protected $filters = true;
    protected $ordering = true;

    protected $query;

    /**
     * EloquentDataProvider constructor.
     * @param Builder $query
     */
    public function __construct(Builder $query)
    {
        $this->query = clone $query;
    }

    /**
     * Applies filter to a column
     * @param \Closure| $filter
     * @param string $fieldName
     * @param Builder $query
     * @param mixed $value
     * @return void
     */
    private function applyFilter($filter, string $fieldName, Builder $query, $value)
    {
        if (is_callable($filter)) {
           $filter($query, $value);
           return;
        }

        switch ($filter) {
            case '=':
                $query->where($fieldName, '=', $value);
                break;

            case 'like':
                $query->where($fieldName, 'LIKE', '%' . $value . '%');
                break;

            default:
                throw new GridViewConfigException('Unknown filter type: ' . $filter);
        }
    }

    /**
     * @param GridViewRequest $request
     * @return Builder
     */
    protected function baseQuery(GridViewRequest $request)
    {
        $query = clone $this->query;

        if ($this->filters !== false) {
            foreach ($request->filters as $field => $value) {
                if ($this->filters === true || in_array($field, $this->filters)) {
                    $query->where($field, 'LIKE', '%' . $value . '%');

                } elseif (!empty($this->filters[$field])) {
                    $this->applyFilter($this->filters[$field], $field, $query, $value);
                }
            }
        }

        if ($request->sortColumn && ($this->ordering === true || in_array($request->sortColumn, $this->ordering))) {
            $query->reorder($request->sortColumn, $request->sortOrder);
        }

        return $query;
    }

    /**
     * @inheritdoc
     */
    public function getCount(GridViewRequest $request) : int
    {
        return $this->baseQuery($request)->count();
    }

    /**
     * @inheritdoc
     */
    public function getData(GridViewRequest $request)
    {
        $query = $this->baseQuery($request);

        if ($request->perPage == 0) {
            return $query->get();
        }

        return $query->offset(($request->page - 1) * $request->perPage)
            ->limit($request->perPage)
            ->get();
    }
}