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

时间:2017-01-07 13:38:25

标签: php laravel eloquent laravel-eloquent

我的模型方法带参数有问题。我有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;
}

我以JSON格式返回结果(我使用Laravel作为api)。但这种方法不起作用。它引发了我的错误:

  

调用未定义的方法Illuminate \ Database \ Query \ Builder :: contentTranslations()

前段时间,我想为所有语言返回contentTranslations,所以我在contentTranslations模型方法中没有参数,在foreach循环中调用$page->contentTranslations;后一切正常。为什么我把参数传递给方法会遇到麻烦?

1 个答案:

答案 0 :(得分:1)

您应该使用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');
}