Я довольно новичок в laravel, и мне нужно удалить 'выражение where' из Query Builder, основываясь на выбранных или отсутствующих параметрах поиска.
Моя модель содержит следующее уже в локальной области:
$builder->where('users.active', '=', 'Yes');
и мне нужно переопределить это в определенных условиях поиска c, чтобы разрешить значения «Да» и «Нет», или просто полностью удалить предложение. Это должно быть сделано в Trait и подходит для многократного использования / моделей.
Я действительно заставил это работать, добавив новый метод в мой SearchTrait, который разделяет построитель запросов, удаляет столбец, вызвавший ошибку, и связанный с ним связывание и возвращает измененный построитель запросов.
$builder = static::removeWhere($builder, 'users.active');
Кажется, это работает - но мой вопрос (ы):
- Это подходящее решение или есть что-то более элегантное?
- Есть ли какие-либо явные проблемы с моим решением?
- Есть ли лучшее место для этого / можно ли легко расширить «строитель»?
/**
* @param Builder $builder
* @param $whereColumn
* @return Builder
*/
public static function removeWhere(Builder $builder, $whereColumn)
{
$bindings = $builder->getQuery()->bindings['where'];
$wheres = $builder->getQuery()->wheres;
$whereKey = false;
foreach ($wheres as $key => $where) {
if ($where['column'] == $whereColumn) {
$whereKey = $key;
break;
}
}
if ($whereKey !== false) {
unset($bindings[$whereKey]);
unset($wheres[$whereKey]);
}
$builder->getQuery()->wheres = $wheres;
$builder->getQuery()->bindings['where'] = $bindings;
return $builder;
}