php Laravel:如何从查询生成器中删除特定的“where”子句

4xrmg8kj  于 2023-03-16  发布在  PHP
关注(0)|答案(1)|浏览(289)

我是相当新的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;
    }
ql3eal8s

ql3eal8s1#

我不确定这是否“在学术上正确”,但这对我很有效:

$query = Model::whereIn('id', [1,2,3]);

$count = $query->count();
$countCondition1 = $query->where('condition1', 1)->count();

array_pop ($query->getQuery()->bindings['where']);
array_pop ($query->getQuery()->wheres);

$countCondition2 = $query->where('condition2', 1)->count();

array_pop ($query->getQuery()->bindings['where']);
array_pop ($query->getQuery()->wheres);

$countCondition3 = $query->where('condition3', 1)->count();

// ...

相关问题