내 컨트롤러에 내 모델을로드하려고 시도하고 이것을 시도했습니다.
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. 정적 메서드를 호출하려면을 사용하고 ::
메서드를 static으로 정의해야합니다.
// 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
. 그 후, 다른 모든 메소드는 인스턴스 메소드 로 호출됩니다 .
답변
스코프를 추가해보세요. 스코프는 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의 Eloquent #scopes
답변
TL; DR . MyModel::query()->find(10);
대신 쿼리를 표현하여이 문제를 해결할 수 있습니다 MyModel::find(10);
.
내가 아는 한 PhpStorm 2017.2 시작 코드 검사는 다음과 같은 방법에 대해 실패합니다.MyModel::where()
, MyModel::find()
등 (이 확인 스레드 ). 코드를 커밋하기 전에 PhpStorm의 Git 통합 을 사용하려고하면 PhpStorm 이 이러한 정적 메서드 호출 경고에 대해 불평하는 것을 멈추지 않을 것입니다.
이 문제를 해결하는 우아한 방법 (IMOO) 중 하나 는 의미가있는 곳 을 명시 적으로 호출::query()
하는 것입니다. 이렇게하면 무료 자동 완성과 멋진 쿼리 형식의 이점을 얻을 수 있습니다.
예
검사에서 정적 메서드 호출에 대해 불평하는 스 니펫
$myModel = MyModel::find(10); // static call complaint
// another poorly formatted query with code inspection complaints
$myFilteredModels = MyModel::where('is_beautiful', true)
->where('is_not_smart', false)
->get();
불만이없는 올바른 형식의 코드
$myModel = MyModel::query()->find(10);
// a nicely formatted query with no complaints
$myFilteredModels = MyModel::query()
->where('is_beautiful', true)
->where('is_not_smart', false)
->get();
답변
이것이 누군가에게 도움이되는 경우를 대비 하여 로컬 범위를 호출 할 때 범위 접두사를 사용해서는 안된다는 명시된 사실 을 완전히 놓 쳤기 때문에이 오류가 발생했습니다 . 따라서 다음과 같이 모델에 로컬 범위를 정의한 경우 :
public function scopeRecentFirst($query)
{
return $query->orderBy('updated_at', 'desc');
}
다음과 같이 호출해야합니다.
$CurrentUsers = \App\Models\Users::recentFirst()->get();
접두사 scope
는 호출에 없습니다.
답변
이렇게 줄 수 있어요
public static function getAll()
{
return $posts = $this->all()->take(2)->get();
}
그리고 컨트롤러 함수 내부에서 정적으로 호출 할 때도 ..
답변
나는 문자 그대로 내 경우에 대한 답에 도달했습니다. 저는 create 메서드를 구현 한 시스템을 만들고 있으므로 Eloquent가 아닌 재정의 된 버전에 액세스했기 때문에이 실제 오류가 발생했습니다.
도움이 되었나요?
답변
모델에서 getAll () 메소드를 선언하지 않았는지 확인하십시오. 그러면 컨트롤러가 비 정적 메서드를 호출하고 있다고 생각하게됩니다.