Laravel - 调用模型的方法抛出未定义的方法 Illuminate\Database\Query\Builder
Laravel - calling model's method throws undefined method Illuminate\Database\Query\Builder
我对带有参数的模型方法有疑问。我有 2 Page
和 ContentTranslation
。我想根据语言获得 ContentTranslation
,所以我在 Page
模型中有以下方法:
public function contentTranslations($language) {
return $this->hasMany('App\ContentTranslation')->where('language', $language);
}
然后我在 PageController
中找到了一个基于语言获取页面的方法:
public function getPagesByLanguage($language)
{
$pages = Page::orderBy('position', 'asc')->get();
foreach ($pages as $page) {
$page->contentTranslations($language);
}
$return $pages;
}
我正在 return 以 JSON 格式处理我的结果(我使用 Laravel 作为 api)。但这种方法行不通。它抛出错误:
Call to undefined method Illuminate\Database\Query\Builder::contentTranslations()
前段时间,我想 return contentTranslations
所有语言,所以我在 contentTranslations
模型方法中没有参数,调用 [= 后一切正常21=] 在 foreach 循环中。为什么我在将参数传递给方法时遇到问题?
你应该使用 eager loading to avoid N+1 query problem:
public function getPagesByLanguage($language)
{
return Page::with(['contentTranslations' => function($q) use ($language) {
$q->where('language', $language);
}])
->orderBy('position', 'asc')
->get();
}
同时将您的关系更改为:
public function contentTranslations() {
return $this->hasMany('App\ContentTranslation');
}
我对带有参数的模型方法有疑问。我有 2 Page
和 ContentTranslation
。我想根据语言获得 ContentTranslation
,所以我在 Page
模型中有以下方法:
public function contentTranslations($language) {
return $this->hasMany('App\ContentTranslation')->where('language', $language);
}
然后我在 PageController
中找到了一个基于语言获取页面的方法:
public function getPagesByLanguage($language)
{
$pages = Page::orderBy('position', 'asc')->get();
foreach ($pages as $page) {
$page->contentTranslations($language);
}
$return $pages;
}
我正在 return 以 JSON 格式处理我的结果(我使用 Laravel 作为 api)。但这种方法行不通。它抛出错误:
Call to undefined method Illuminate\Database\Query\Builder::contentTranslations()
前段时间,我想 return contentTranslations
所有语言,所以我在 contentTranslations
模型方法中没有参数,调用 [= 后一切正常21=] 在 foreach 循环中。为什么我在将参数传递给方法时遇到问题?
你应该使用 eager loading to avoid N+1 query problem:
public function getPagesByLanguage($language)
{
return Page::with(['contentTranslations' => function($q) use ($language) {
$q->where('language', $language);
}])
->orderBy('position', 'asc')
->get();
}
同时将您的关系更改为:
public function contentTranslations() {
return $this->hasMany('App\ContentTranslation');
}