Laravel - 调用模型的方法抛出未定义的方法 Illuminate\Database\Query\Builder

Laravel - calling model's method throws undefined method Illuminate\Database\Query\Builder

我对带有参数的模型方法有疑问。我有 2 PageContentTranslation。我想根据语言获得 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');
}