我是相当新的laravel和需要删除一个'where子句'从查询构建器的基础上搜索选项被选中与否。
我的模型包含以下已在本地范围中的内容:
$builder->where('users.active', '=', 'Yes');
我需要在一个特定的搜索环境中覆盖它,要么允许“是”和“否”的值,要么完全删除该子句。这必须在一个特质中完成,并适合多用途/模型。
我实际上是通过在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;
}
1条答案
按热度按时间ql3eal8s1#
我不确定这是否“在学术上正确”,但这对我很有效: