为什么在Eloquent模型中调用方法时,我得到“非静态方法不应该被静态调用”?

2022-08-30 07:39:58

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

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();

}

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


答案 1

您将方法定义为非静态方法,并尝试将其调用为静态方法。可是。。。

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


答案 2

为什么不尝试添加范围?范围是Eloquent的一个非常好的功能。

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 Docs中的雄辩#scopes


推荐