【问题标题】:How resolve BadMethodCallException, Call to undefined method Illuminate\Database\Query\Builder::filter()如何解决 BadMethodCallException,调用未定义的方法 Illuminate\Database\Query\Builder::filter()
【发布时间】:2019-10-20 07:00:54
【问题描述】:

我正在尝试过滤来自 eloquent 查询的结果,但出现下一个错误 BadMethodCallException。在我看来,我做的一切都是正确的。

我正在使用 Laravel 5.4

错误详情:

BadMethodCallException
Call to undefined method Illuminate\Database\Query\Builder::filter()
in Builder.php line 2445
at Builder->__call('filter', array(null))
in Builder.php line 1254
at Builder->__call('filter', array(null))
in web.php line 459
at Router->{closure}()
in Route.php line 189
at Route->runCallable()
in Route.php line 163
at Route->run()
in Router.php line 572

我有下一个代码:

public function index(SearchRequest $searchRequest, ConfigurationFilter $filters)
    {
        $filtered_configurations = Configuration::whereTrash(false)->with(['customs.properties', 'properties'])->filter($filters);

        $types = $this->getConfigurationTypes();
        $authors = $this->getAuthors();

        return view('configuration.assistant.index', [
            'configurations' => $filtered_configurations->paginate(10),
            'authors' => $authors,
            'types' => $types,
        ]);
    }

SearchRequest 在哪里:

class SearchRequest extends FormRequest {

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return Auth::user()->author != null;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
        ];
    }
}

ConfigurationFilter 在哪里:

class ConfigurationFilter extends ModelFilter
{
    public function name($value)
    {
        return $this->builder->where('name', 'like', "%{$value}%");
    }

    public function author($id)
    {
        return $this->builder->whereIn('user_id', explode(',', $id));
    }

    public function type($type)
    {
        return $this->builder->whereIn('category_id', explode(',', $type));
    }

    public function status($status)
    {
        return $this->builder->whereEnabled($status == 'enabled');
    }
}

ModelFilter 在哪里:

class ModelFilter extends QueryFilter implements Filter
{
    public function id($id)
    {
        return $this->builder->whereIn('id', explode(',', $id));
    }

    public function from($date)
    {
        return $this->builder->where('created_at', '>=', $date);
    }

    public function to($date)
    {
        return $this->builder->where('created_at', '<=', $date);
    }

    public function enabled($status)
    {
        return $this->builder->whereEnabled($status === 'true');
    }

    public function trash($status)
    {
        return $this->builder->whereTrash($status === 'true');
    }

    public function take($limit = 100)
    {
        return $this->builder->take($limit);
    }
}

Filter 在哪里:

interface Filter {

    public function id($id);

    public function from($date);

    public function to($date);

    public function enabled($status);

    public function trash($status);

    public function take($limit = 100);
}

我会错过什么?

提前致谢

【问题讨论】:

  • 您调用过滤器方法的实例是查询构建器实例,其中过滤器是收集方法。这就是您收到此错误的原因。可能正在使用$filtered_configurations = Configuration::whereTrash(false)-&gt;with(['customs.properties', 'properties'])-&gt;get()-&gt;filter($filters); 可能会给您一些想法,或者可能对您有用。
  • 我已经解决了,我在模型中添加了下一个函数:public function scopeFilter($query, QueryFilter $filters) { return $filters-&gt;apply($query); }
  • 您可以将其发布为您问题的答案并将其标记为正确。

标签: php laravel filter eloquent


【解决方案1】:

我已经解决了,我在模型中添加了下一个函数:

public function scopeFilter($query, QueryFilter $filters)
{
    return $filters->apply($query);
}

【讨论】:

    猜你喜欢
    • 2019-12-12
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    相关资源
    最近更新 更多