2017-01-07 16 views
1

パラメータのあるモデルのメソッドに問題があります。私は2 PageContentTranslationを持っています。私は言語に基づいてContentTranslationを取得したいので、私はPageモデルに以下の方法を持っている:Laravel - 呼び出し元モデルのメソッドが未定義のメソッドを投げる Database Query Builder

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として使用しています)。しかし、このアプローチはうまくいきません。

Call to undefined method Illuminate\Database\Query\Builder::contentTranslations()

は、いくつかの時間前、私は、すべての言語のcontentTranslationsを返したかったので、私はcontentTranslationsモデルメソッドのパラメータを持っていないし、すべてがforeachループで$page->contentTranslations;を呼び出した後にうまく働いた:それは私にエラーがスローされます。なぜ私はパラメータをメソッドに渡すことに問題がありますか?

答えて

1

あなたはeager loading to avoid N+1 query problemを使用する必要があります。それは私が期待どおりに動作...しかし、私は今から一部のカラムだけを選択するために何をしたい場合は、

public function contentTranslations() { 
    return $this->hasMany('App\ContentTranslation'); 
} 
+0

グレート:

public function getPagesByLanguage($language) { return Page::with(['contentTranslations' => function($q) use ($language) { $q->where('language', $language); }]) ->orderBy('position', 'asc') ->get(); } 

はまたにあなたの関係を変更します'contentTranslations'? '$ q-> where ...'文の後に ' - > select(array( 'slug'、 'language')'を追加しようとしましたが、content_translations配列の0個の項目を返します。 ?:) – user3216673

+1

あなたはこの '$ q-> where( 'language'、$ language) - > select(['page_id'、 'slug'、 'language'];関係作業をする。 –

関連する問題