Почему я получаю "нестатический метод не должен называться статически" при вызове метода в красноречивой модели?


Я пытаюсь загрузить мою модель в мой контроллер и попробовал это:

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

}

Как правильно загрузить модель в контроллер, а затем вернуть его содержимое?

8   51   2013-08-20 19:56:56

8 ответов:

вы определили свой метод как статический, и вы пытаетесь вызвать его как статический. То, что сказал...

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

Примечание: в Ларавеле почти все красноречивы методы возвращают экземпляр вашей модели, позволяя вам цепочку методов, как показано ниже:

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

в этом коде мы статически вызов 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();

красноречивые # scopes в Laravel Docs

TL; DR. Вы можете обойти это, выражая свои запросы как MyModel::query()->find(10); вместо MyModel::find(10);.

насколько мне известно, начиная PhpStorm 2017.2 проверка кода не для таких методов, как MyModel::where(),MyModel::find() и т. д. (проверить это thread). Это может стать довольно раздражающим, когда вы пытаетесь, скажем, использовать интеграция Git PhpStorm перед совершением код PhpStorm не перестану жаловаться об этих предупреждениях вызова статического метода.

один элегантный способ (IMOO) обойти это -явного вызова ::query() везде, где это имеет смысл. Это позволит вам воспользоваться бесплатным автозаполнением и хорошим форматированием запроса.

примеры

сниппет, где инспекция жалуется на статические вызовы метода

$myModel = MyModel::find(10); // static call complaint

// another poorly formatted query with code inspection complaints
$myFilteredModels = MyModel::where('is', 'beautiful')
    ->where('is_not', 'smart')
    ->get();

хорошо отформатированный код без жалоб

$myModel = MyModel::query()->find(10);

// a nicely formatted query with no complaints
$myFilteredModels = MyModel::query()
    ->where('is', 'beautiful')
    ->where('is_not', 'smart')
    ->get();

вы можете дать такой

public static function getAll()
{

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

}

и когда вы вызываете статически внутри вашей функции контроллера также..

проверьте, если вы не объявили метод getAll () в модели. Что заставляет контроллер думать, что вы вызываете нестатический метод.

использовать следующий синтаксис return Post::getAll(); у вас должна быть магическая функция __callStatic в вашем классе, где обрабатываются все статические вызовы:

public static function __callStatic($method, $parameters)
{
    return (new static)->$method(...$parameters);
}

на всякий случай это помогает кому - то, я получал эту ошибку, потому что я полностью пропустил констатируется факт что префикс области не должен использоваться при вызове локальной области. Поэтому, если вы определили локальную область в своей модели следующим образом:

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

вы должны назвать это так:

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

обратите внимание, что префикс scope нет в вызове.

Я буквально только что пришел к ответу в моем случае. Я создаю систему, которая реализовала метод create, поэтому я получал эту фактическую ошибку, потому что я обращался к переопределенной версии, а не к той, которая была у Eloquent.

надеюсь, что это поможет?