为什么我在调用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(); } 

在控制器中加载模型然后返回其内容的正确方法是什么?

您将您的方法定义为非静态方法,并试图将其作为静态方法调用。 那说…

  1. …如果你想调用一个静态方法,你应该使用::和静态方法来定义你的方法。

     // Defining a static method in a Foo class. public static function getAll() { /* code */ } // Invoking that static method Foo::getAll(); 
  2. 否则,如果你想调用一个实例方法,你应该实例化你的类,使用->

     // 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的版本。

希望有帮助?