2017-08-01 8 views
0

私はデータベースにhasManyTrough()リレーションを持っていますが、それを雄弁で扱うことができませんでした。Eloquent ORM hasManyTrough

関係私のデータベース

category(id) 
entry(id) 
category_entries(category_id, entry_id) 

に私は3つのモデル

Category 
    has_many CategoryEntries 

Entry 
    has_many CategoryEntries 

CategoryEntry 
    belongs_to Category 
    belongs_to Entry 

を持っているので、すべてのカテゴリでは、多くのエントリを持っており、すべてのエントリには、多くのカテゴリがあります。

私は雄弁

CategoryEntry 
    public function category(){ 
     return $this->belongsTo('App\Category'); 
    } 
    public function entry(){ 
     return $this->belongsTo('App\Entry'); 
    } 

    Category 
    public function categoryEntries(){ 
     return $this->hasMany('App\CategoryEntry'); 
    } 

    Entry 
    public function categoryEntries(){ 
     return $this->hasMany('App\CategoryEntry'); 
    } 


    public function categories() 
    { 
     return $this->hasManyThrough('App\Category', 'App\CategoryEntry', 'category_id', 'id'); 
    } 

に次のように作成しているが、これは次のSQLコマンドを作成する、次の

Entry 
    has_many CategoryEntries 
    has_many Categories, through: :category_entries 

だろうレールで

select `entries`.*, `category_entries`.`category_id` from `entries` 
inner join `category_entries` on `category_entries`.`id` = `entries`.`entry_id` 

これが可能にいいえ。私のミスはどこですか?あなたの質問で述べたように

答えて

3

、関係が

Categoryです(hasManyの)Entry(hasManyの)CategoryEntries

だから我々は

class Category 
....... 

public function categoryEntries() 
{ 
    $this->hasManyThrough(App\CategoryEntry::class, App\Entry::class); 
} 

EntryモデルでCategoryモデルでhasManyThrough関係ではなく追加することができます更新

あなたが与えたデータベースに基づいて関係がある場合、CategoryEntryの間に多対多の関係があります。あなたは持つことができます、

class Entry 
.... 

public function categories() 
{ 
    return $this->belongsToMany(App\Category::class, 'category_entries'); 
} 
+0

hmしかし、両方のモデルhasMany 'CategoryEntry'関係があります。 'CategoryEntry'モデルで各エントリの' Category'を得ることができないのはなぜですか? – rob

+0

あなたのアップデートに基づいて、ピボットテーブルの多対多関係を参照していますか?指定されたコード部分と与えられた関係とが矛盾しています –

+0

私は参照してください。私は私の質問で間違いを犯しました。私の 'Entry'には全ての' Categories'が必要です。だから私は別々のモデル 'CategoryEntry'を使ってMany-Many関係を構築します。またはこれはlaravelの悪い方法ですか? – rob