93

コントローラーにモデルをロードしようとして、これを試しました:

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

}

モデルをコントローラにロードしてその内容を返す正しい方法は何ですか?

4

9 に答える 9

125

メソッドを非静的として定義し、それを静的として呼び出そうとしています。それは言った...

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その後、他のすべてのメソッドはインスタンス メソッドとして呼び出されます。

于 2013-08-20T18:16:44.237 に答える
3

これが誰かに役立つ場合に備えて、ローカルスコープを呼び出すときにスコーププレフィックスを使用してはならないという事実を完全に見逃したため、このエラーが発生していました。したがって、モデルでローカル スコープを次のように定義したとします。

public function scopeRecentFirst($query)
{
    return $query->orderBy('updated_at', 'desc');
}

次のように呼び出す必要があります。

$CurrentUsers = \App\Models\Users::recentFirst()->get();

プレフィックスscopeは通話に含まれていないことに注意してください。

于 2018-09-27T07:53:51.140 に答える