Спасибо за ваши предложения, но я нашел другое решение:
/**
* @param array $params
*
* @param $orderBy
* @param $sortBy
*
* @return Collection
*/
public function findOrdersBy(array $params, $orderBy = 'id', $sortBy = 'asc'): Collection
{
$release_date_start = array_get($params, 'release_date_start');
$release_date_end = array_get($params, 'release_date_end');
$orders = $this->model->newQuery();
if (!is_null($release_date_start) && !is_null($release_date_end)) {
$orders->whereBetween('releaseDate', [$release_date_start, $release_date_end]);
} else {
if (!is_null($release_date_start)) {
$orders->where('releaseDate', '>=', $release_date_start);
} else {
if (!is_null($release_date_end)) {
$orders->where('releaseDate', '<=', $release_date_end);
}
}
}
$fields = collect($params)->except($this->filtersArray())->all();
$orders = $this->includeQuery($orders, $fields);
return $orders->orderBy($orderBy, $sortBy)->get();
}
/**
* @param Builder $orderBuilder
* @param array $params
*
* @return Builder
*/
private function includeQuery(Builder $orderBuilder, ... $params) : Builder
{
$orders = [];
foreach ($params as $param) {
$orders = $orderBuilder->where($param);
}
return $orders;
}
/**
* @return array
*/
private function filtersArray() : array
{
return [
'release_date_start',
'release_date_end',
'order_by',
'sort_by',
'includes'
];
}
Главный фактор для private method includeQuery(Builder $orderBuilder, ... $params)
, который принимает $params
в качестве аргумента переменной длины . Мы просто перебираем переменные, передаваемые в качестве параметра запроса /orders?code=123&something=test
, и передаем их как предложение where()
в построителе запросов.
Некоторые параметры могут не являться свойством вашего объекта, поэтому мы должны фильтровать только те параметры запроса, которые соответствуют свойствам объекта. Поэтому я создал filtersArray()
, который будет возвращать исключаемые параметры и предотвращать ошибку.
Хммм, на самом деле, при написании этого я должен иметь противоположность, которая only()
, иначе он будет иметь бесконечное множество вещей, которые нужно исключить. :) Это был бы еще один рефакторинг : P