Files
monica/app/Traits/Searchable.php
T

50 lines
1.5 KiB
PHP

<?php
namespace App\Traits;
use App\Helpers\DBHelper;
use App\Helpers\StringHelper;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
trait Searchable
{
/**
* Search for needle in the columns defined by $searchable_columns.
*
* @param Builder $builder query builder
* @param string $needle
* @param int $accountId
* @param int $limitPerPage
* @param string $sortOrder
* @param string $whereCondition
*
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator|null
*/
public function scopeSearch(Builder $builder, $needle, $accountId, $limitPerPage, $orderBy, $whereCondition = null, $sortOrder = null): ?LengthAwarePaginator
{
if ($this->searchable_columns == null) {
return null;
}
$searchableColumns = array_map(function ($column) {
return DBHelper::getTable($this->getTable()).".`$column`";
}, $this->searchable_columns);
$queryString = StringHelper::buildQuery($searchableColumns, $needle);
$builder->whereRaw(DBHelper::getTable($this->getTable()).".`account_id` = $accountId AND ($queryString) $whereCondition");
$builder->orderByRaw($orderBy);
if ($sortOrder) {
$builder->sortedBy($sortOrder);
}
$builder->select(array_map(function ($column) {
return "{$this->getTable()}.$column";
}, $this->return_from_search));
return $builder->paginate($limitPerPage);
}
}