private function applyFilters(Builder $query, $expression, $value, $multiple = false)
{
$equalsFilter = false;
$field = null;
$filter = explode(":", $expression);
// filter[field:filter]=value
if (count($filter) == 2) {
$field = $filter[0];
$filter = $filter[1];
} else {
$equalsFilter = true;
$field = $expression;
}
// filter[field]=value
if ($equalsFilter) {
$multiple ? $query->orWhere($field, '=', $value) : $query->where($field, '=', $value);
}
// filter[field:between]=A,B
if ($this->isBetweenFilter($filter)) {
$betweenValues = $this->getBetweenValues($value);
if (count($betweenValues) != 2) {
throw new BadRequestHttpException("Please specify two numbers to filter between");
}
$multiple ? $query->orWhereBetween($field, $betweenValues) : $query->whereBetween($field, $betweenValues);
}
// filter[field:[after, before, greater_than, less_than]]=value
if ($this->isComparisonFilter($filter)) {
if ($this->isDateFilter($field)) {
$value = Carbon::createFromTimestamp($value);
}
$comparisonFilter = $this->getComparisonFilter($filter);
$multiple ? $query->orWhere($field, $comparisonFilter, $value) : $query->where($field, $comparisonFilter, $value);
}
// filter[field:[contains, ends_with, starts_with]]=value
if ($this->isWildcardFilter($filter)) {
$value = $this->getLikeWildcard($filter, $value);
$multiple ? $query->orWere($field, 'like', $value) : $query->where($field, 'like', $value);
}
// filter[field:trashed]=true
if ($this->isTrashedFilter($field)) {
$query->onlyTrashed();
}
}