为什么在调用Eloquent模型中的方法时,会出现“Non-static method should not be called statically”错误?

4 浏览
0 Comments

为什么在调用Eloquent模型中的方法时,会出现“Non-static method should not be called statically”错误?

我试图在控制器中加载我的模型并尝试了以下代码: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();
}

正确的方法是如何在控制器中加载模型并返回其内容?

0
0 Comments

问题出现的原因是在调用Eloquent模型中的方法时,出现了"Non-static method should not be called statically"的错误。解决方法是将查询表达式表示为MyModel::query()->find(10);而不是MyModel::find(10);

根据我所了解,从PhpStorm 2017.2开始,代码检查在诸如MyModel::where()MyModel::find()等方法上失败了(请查看此线程),这可能会非常让人恼火。

一个(优雅的)解决方法是在适当的地方显式调用::query()。这将使你可以享受到自动补全和漂亮的缩进的好处。

以下是示例:

错误的示例

代码检查报错的片段

// 静态方法调用报错
$myModel = MyModel::find(10); 
// 另一个格式不良的查询,代码检查报错
$myFilteredModels = MyModel::where('is_foo', true)
    ->where('is_bar', false)
    ->get();

正确的示例

漂亮缩进的代码,没有报错

// 没有报错
$myModel = MyModel::query()->find(10); 
// 格式良好且缩进良好的查询,没有报错
$myFilteredModels = MyModel::query()
    ->where('is_foo', true)
    ->where('is_bar', false)
    ->get();

仅仅为了消除错误的IDE警告而更改代码听起来不是一个好主意。如果你知道代码是正确的,那就保持原样。

是的,先生,我完全同意为了取悦IDE而更改代码并不总是一个好的做法,但是在这种情况下,我们只是添加了一个本来就会被调用的静态方法调用(我们只是在这里明确)。否则,您将不得不:要么禁用此检查,要么在其他地方注释另一个类...(麻烦!您同意吗?)

同样,我真的很喜欢这个答案。我本来就不是Facade的忠实粉丝,而且PhpStorm默认情况下不支持它们,这让我对它们的喜爱程度降低了。MyModel::query()非常清楚地说明了内部发生的情况,同时也使IDE感到满意。

0
0 Comments

问题的出现的原因是:尝试在Eloquent模型中调用一个非静态方法时,出现了'Non-static method should not be called statically'的错误。

解决方法是:添加Scope(作用域)来解决这个问题。作用域是Eloquent的一个非常好的特性。通过在模型中定义作用域方法,可以在查询中重用一些常用的条件。

具体的解决方法是,在模型中添加作用域方法。例如,在User模型中添加了两个作用域方法:popular和women。然后,在调用模型方法时,使用这些作用域方法来构建查询。

以下是一个示例代码:

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官方文档中找到。

通过使用作用域方法,可以在Eloquent模型中解决调用非静态方法时出现的错误。使用作用域方法可以在查询中重用常用的条件,并且可以通过链式调用这些方法来构建复杂的查询。

0
0 Comments

为什么在调用Eloquent模型中的方法时会出现“Non-static method should not be called statically”的问题以及解决方法

问题的原因是你将方法定义为非静态方法,但你却试图以静态方式调用它。解决方法如下:

1.如果你想调用一个静态方法,你应该使用"::"操作符,并将方法定义为静态方法。

// 在Foo类中定义一个静态方法
public static function getAll() { /* 代码 */ }
// 调用这个静态方法
Foo::getAll();

2.如果你想调用一个实例方法,你需要实例化你的类,并使用"->"操作符。

// 在Foo类中定义一个非静态方法
public function getAll() { /* 代码 */ }
// 调用这个非静态方法
$foo = new Foo();
$foo->getAll();

值得注意的是,在Laravel中,几乎所有的Eloquent方法都返回模型的实例,这允许你链式调用方法,如下所示:

$foos = Foo::all()->take(10)->get();

在这段代码中,我们通过Facade以静态方式调用了"all"方法。之后,所有其他的方法都被作为实例方法调用。

为什么第二种方法中的getAll()方法是非静态的呢?

感谢你提醒我这一点。我已经根据你的建议更新了我的回答。

“在Laravel中,几乎所有的Eloquent方法都是静态定义的”这是一个误解。没有一个是静态的。

请问,你能解释一下这个误解吗?

等等,PHP难道不允许我们创建既可以以静态方式调用又可以以非静态方式调用的函数吗?

是的,在Laravel中,没有一个Eloquent方法是静态定义的。我们可以像静态方法一样使用它们,但那只是Facade的一种实现方式,更多相关信息请参考:laravel.com/docs/facades

虽然这个回答是事实的,但在Laravel的上下文中,这不太可能是用户在这个线程上寻找的解决方法。这个回答应该被移除,keithics的回答应该被标记为正确答案。

0