2017-11-27 30 views
0

を使用して、私は別のテーブルからforeign keyとしてitem_idを持ってinvoiceDetailsをテーブルと呼ばれているテーブルからforeign keyとしてcategory_idcategories呼び出したitemsと呼ばれます。ララベル|雄弁hasManyThrough

私は雄弁使用して、次のことをやりたい:

$result = InvoiceDetail::groupBy('item_id') 
       ->selectRaw('sum(qty) as qty, item_id')->with('item', 'category')->get(); 

が、私はエラーを取得しています:

public function invoiceDetail() { 
     return $this->hasManyThrough('App\InvoiceDetail', 'App\Item', 'category_id', 'item_id'); 
} 

任意の提案:

Call to undefined relationship [category] on model [App\InvoiceDetail]. 

ここCategoryモデル内の私の関係ですか?

+0

トライ[DOC]で述べたように、最後に 'ID'、 'ID' を追加する(https://laravel.com/docs/5.5/eloquent-relationships#has-many-through)。そして、はいこのメソッドは、InvoiceDetailモデルで記述する必要があります。カテゴリモデルにない – rahulsm

答えて

0

InvoiceDatailすべてのアイテムに属するオブジェクトがすべてカテゴリに属していない場合は、hasManyThroughリレーションが必要な場合もあります。その部分はあなたの質問から明らかではありません。

しかし、あなたの例では、別のitem_idからカテゴリを持つアイテムを取得しています。

これが機能しない理由は、存在しないInvoiceDetailオブジェクトからカテゴリの関係を取得しようとしているためです。

あなたが InvoiceDetailに基づいていない、

->with('item.category') 

関係は次のようにする必要があります(あなたが他の関係を定義したことが与えられた)ドット表記法を試してみてください、アイテムの関係に基づいてCategoryをロードしたい

->with('item', 'category') 

この:たとえば、あなたはカテゴリーを持っていて、すべてのInvoiceDetailsをロードしたい場合など

class InvoiceDetail extends Model 
{ 
    public function item() 
    { 
     return $this->belongsTo(\App\Item::class); 
    } 
} 

class Item extends Model 
{ 
    public function invoiceDetails() 
    { 
     return $this->hasMany(\App\InvoiceDetail::class); 
    } 

    public function category() 
    { 
     return $this->belongsTo(\App\Category::class); 
    } 
} 

class Category extends Model 
{ 
    public function items() 
    { 
     return $this->hasMany(\App\Item::class); 
    } 


    public function invoiceDetails() 
    { 
     return $this->hasManyThrough(\App\InvoiceDetail::class, \App\Item::class, 'category_id', 'item_id'); 
    } 
} 

あなたはhasManyThroughを使用したいと思います直接。

dd($category->invoiceDetails); 
+0

偉大な答えは、ドット表記法が働いた。あなたはそこに有用なリファレンスを見つけられなかったので、 'hasManyThrough'の使用法を明確にしてください。 – CairoCoder

+0

@CairoCoderドキュメントには、実際にはかなり良い例が含まれています。https://laravel.com/docs/5.5/eloquent-relationships#has-many-through – Robert

+0

逆のことはありません。 – CairoCoder