Laravel :: all()替代返回Builder对象的

时间:2018-05-18 11:31:06

标签: php laravel

我有一个特定类的模型,我想通过将带有条件的Filter对象传递给一个解析它的方法和不同类型的链where来进一步过滤,最后只返回模型匹配过滤器。

为此,我想找到一个等同于调用:: all()的方法,但返回一个Eloquent\Builder实例,而不是Collection

// Returns Collection
App\Entity\Post::all();

// Returns Eloquent\Builder
App\Entity\Post::query();

// Returns Query\Builder
\DB::table('posts');

/**
 * This method allows you to make complex Eloquent queries based on an existing one.
 *
 * @param Eloquent\Builder $query
 * @param App\Entity\Filter $filter
 * @return Eloquent\Builder
 */
function parse_filter(Eloquent\Builder &$query, App\Entity\Filter $filter)
{
    $rules  = $filter->rules;
    $groups = $this->_prepare_groups($rules);
    return $this->_parse_groups($query, $groups);
}

/**
 * @param Eloquent\Builder $query
 * @param array   $groups
 * @return Eloquent\Builder
 */
function _parse_groups(Eloquent\Builder &$query, array $groups)
{
    foreach ($groups as $key => $group) {
        // chain with previous conditions
        // make Closures using group data
        // run Closures on Query I have so far
    }
    return $query;
}

2 个答案:

答案 0 :(得分:1)

您实际上可以静态调用::query()来实现这些结果。 如果您的需求\DB::table('models')可以互换,或者比Eloquent\Builder返回的Query\Builder更受欢迎,那么这也可以替代\DB::table()

答案 1 :(得分:1)

我不确定您的完整要求但是您可以尝试使用laravel宏

Builder::macro(
            'customAll',
            function (App\Entity\Filter $filter) {
                $rules  = $filter->rules;
                $groups = $this->_prepare_groups($rules);
                return $this->_parse_groups($query, $groups);

            }
        );