ok

Mini Shell

Direktori : /home2/selectio/public_html/billingsoftwarenew/core/app/Traits/
Upload File :
Current File : //home2/selectio/public_html/billingsoftwarenew/core/app/Traits/Searchable.php

<?php

namespace App\Traits;

use Carbon\Carbon;

trait Searchable {

    /*
    |--------------------------------------------------------------------------
    | Search Data
    |--------------------------------------------------------------------------
    |
    | This trait basically used in model. This will help to implement search.
    | It could search in multiple column, date to date etc.
    | But this trait unable to make search with multiple table.
    |
    */
    public function scopeSearchable($query, $params, $like = true) {
        $search = request()->search;

        if (!$search) {
            return $query;
        }

        $search = $like ? "%$search%" : $search;

        $query->where(function ($q) use ($params, $search) {
            foreach ($params as $key => $param) {
                $relationData = explode(':', $param);
                if (@$relationData[1]) {
                    $q = $this->relationSearch($q, $relationData[0], $relationData[1], $search);
                } else {
                    $column = $param;
                    $q->orWhere($column, 'like', $search);
                }
            }
        });

        return $query;
    }

    public function scopeFilter($query, $params) {

        foreach ($params as $param) {
            $relationData = explode(':', $param);
            $filters = array_keys(request()->all());
            if (@$relationData[1]) {
                $query = $this->relationFilter($query, $relationData[0], $relationData[1], $filters);
            } else {
                $column = $param;
                if (in_array($column, $filters) && request()->$column != null) {
                    $query->where($column, request()->$column);
                }
            }
        }
        return $query;
    }

    function scopeDateFilter($query, $column = 'created_at') {
        if (!request()->date) {
            return $query;
        }
        $date      = explode('-', request()->date);

        $startDate = Carbon::parse(trim($date[0]))->format('Y-m-d');

        $endDate = @$date[1] ? Carbon::parse(trim(@$date[1]))->format('Y-m-d') : $startDate;

        request()->merge(['start_date' => $startDate, 'end_date' => $endDate]);

        request()->validate([
            'start_date' => 'required|date_format:Y-m-d',
            'end_date'   => 'nullable|date_format:Y-m-d',
        ]);

        return  $query->whereDate($column, '>=', $startDate)->whereDate($column, '<=', $endDate);
    }


    private function relationSearch($query, $relation, $columns, $search) {
        foreach (explode(',', $columns) as $column) {
            $query->orWhereHas($relation, function ($q) use ($column, $search) {
                $q->where($column, 'like', $search);
            });
        }
        return $query;
    }

    private function relationFilter($query, $relation, $columns, $filters) {
        foreach (explode(',', $columns) as $column) {
            if (in_array($column, $filters) && request()->$column != null) {
                $query->whereHas($relation, function ($q) use ($column) {
                    $q->where($column, request()->$column);
                });
            }
        }
        return $query;
    }
}

Zerion Mini Shell 1.0