为什么我在调用Eloquent模型中的方法时得到'非静态方法不应该静态调用?
我试图加载我的模型在我的控制器,并试图这样做:
return Post::getAll();
得到了错误Non-static method Post::getAll() should not be called statically, assuming $this from incompatible context
模型中的function如下所示:
public function getAll() { return $posts = $this->all()->take(2)->get(); }
在控制器中加载模型然后返回其内容的正确方法是什么?
您将您的方法定义为非静态方法,并试图将其作为静态方法调用。 那说…
-
…如果你想调用一个静态方法,你应该使用
::
和静态方法来定义你的方法。// Defining a static method in a Foo class. public static function getAll() { /* code */ } // Invoking that static method Foo::getAll();
-
否则,如果你想调用一个实例方法,你应该实例化你的类,使用
->
。// Defining a non-static method in a Foo class. public function getAll() { /* code */ } // Invoking that non-static method. $foo = new Foo(); $foo->getAll();
注意 :在Laravel中,几乎所有的Eloquent方法都会返回模型的一个实例,允许您链接如下所示的方法:
$foos = Foo::all()->take(10)->get();
在那个代码中我们静态地通过Facade调用all
方法。 之后,所有其他方法被称为实例方法 。
为什么不尝试添加范围? 范围是雄辩的一个很好的特征。
class User extends Eloquent { public function scopePopular($query) { return $query->where('votes', '>', 100); } public function scopeWomen($query) { return $query->whereGender('W'); } } $users = User::popular()->women()->orderBy('created_at')->get();
雄辩的#在Laravel Docsscopes
你可以这样给
public static function getAll() { return $posts = $this->all()->take(2)->get(); }
而当你在你的控制器function静态调用也..
检查模型中是否没有声明方法getAll()。 这会导致控制器认为您正在调用一个非静态方法。
我刚刚在我的情况刚刚到达答案。 我创build了一个已经实现了一个创build方法的系统,所以我得到了这个实际的错误,因为我正在访问被覆盖的版本而不是来自Eloquent的版本。
希望有帮助?