我有一个特定类的模型,我想通过将带有条件的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;
}
答案 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);
}
);