2

我对模型的参数方法有疑问。我有 2PageContentTranslation. 我想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所有语言,所以我在模型方法中没有参数,在调用foreach 循环contentTranslations后一切正常。$page->contentTranslations;为什么我在将参数传递给方法时遇到了麻烦?

4

1 回答 1

2

您应该使用急切加载来避免 N+1 查询问题

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');
}
于 2017-01-07T13:42:14.073 回答