是否可以链接非范围的模型查询?

时间:2017-11-02 19:54:27

标签: laravel eloquent

让我通过例子解释。

Model::staticMethod()->localScope()->get(); # works
Model::staticMethod()->nonStaticMethod()->get(); # fail

我有权假设您的模型方法必须是静态的,如果您想链接更多方法,以下方法需要是本地范围方法吗?

让我们说我想要一个查询链接3个方法,序列是可选的,意思是

Model::method1()->method2()->method3();
Model::method2()->method1()->method3();

我将如何设置我的模型?

1 个答案:

答案 0 :(得分:1)

你是对的,如果staticMethod启动一个查询,你将只能从那时开始使用本地范围方法。您可以通过向Model类添加自己的静态方法来解决此问题,该类实际返回模型的实例,以便您可以从那里进行设置。 (或者使用已经为你做过的静态方法,比如create()。)

原因是大多数静态方法实际上并不返回Model类的实例,而是返回Illuminate \ Database \ Eloquent \ Builder类(https://laravel.com/api/5.3/Illuminate/Database/Eloquent/Builder.html)的实例。

Builder的__call()魔术方法拦截Builder类中实际不存在的所有函数,然后使用函数名来执行各种魔术。

如果您感兴趣,实际实现范围的代码是__call方法中的以下3行:

if (method_exists($this->model, $scope = 'scope'.ucfirst($method))) {
        return $this->callScope([$this->model, $scope], $parameters);
}