为什么在 Eloquent 模型中调用方法时出现“不应静态调用非静态方法”?

新手上路,请多包涵

我试图在我的控制器中加载我的模型并尝试了这个:

 return Post::getAll();

得到错误 Non-static method Post::getAll() should not be called statically, assuming $this from incompatible context

模型中的函数如下所示:

 public function getAll()
{

    return $posts = $this->all()->take(2)->get();

}

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

原文由 Sam Pettersson 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 447
2 个回答

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

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 方法。之后,所有其他方法都被称为 _实例方法_。

原文由 Rubens Mariuzzo 发布,翻译遵循 CC BY-SA 4.0 许可协议

原始问题的解决方案

您静态地调用了非静态方法。要使模型中的公共函数静态化,如下所示:

 public static function {

}

一般来说:

 Post::get()

在这种特殊情况下:

 Post::take(2)->get()

在定义关系和范围时要注意的一件事是,当它们被命名相同时,我遇到了一个导致“不应静态调用非静态方法”错误的问题,例如:

 public function category(){
    return $this->belongsTo('App\Category');
}

public function scopeCategory(){
    return $query->where('category', 1);
}

当我执行以下操作时,我收到非静态错误:

 Event::category()->get();

问题是 Laravel 使用的是我的关系方法,称为类别,而不是我的类别范围 (scopeCategory)。这可以通过重命名范围或关系来解决。我选择重命名关系:

 public function cat(){
    return $this->belongsTo('App\Category', 'category_id');
}

请注意我定义了外键(category_id),否则 Laravel 会寻找 cat_id,但它不会找到它,因为我在数据库中将它定义为 category_id。

原文由 Darren Murphy 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题