Eu tenho uma tabela chamada invoiceDetails
que tem a item_id
partir foreign key
de outra tabela chamada items
que tem category_id
como foreign key
da tabela chamada categories
.
Quero fazer o seguinte usando eloquent:
$result = InvoiceDetail::groupBy('item_id')
->selectRaw('sum(qty) as qty, item_id')->with('item', 'category')->get();
mas estou recebendo um erro:
Call to undefined relationship [category] on model [App\InvoiceDetail].
Aqui está minha relação dentro do Category
modelo:
public function invoiceDetail() {
return $this->hasManyThrough('App\InvoiceDetail', 'App\Item', 'category_id', 'item_id');
}
Alguma sugestão?
Não tenho certeza se você precisaria de uma hasManyThrough
relação aqui, a menos que queira buscar todos os InvoiceDatail
objetos pertencentes a todos os itens que por sua vez pertencem à categoria. Essa parte não está clara em sua pergunta.
Mas em seu exemplo, você está obtendo itens com suas categorias de um item_id distinto.
O motivo pelo qual isso não está funcionando é porque você está tentando obter a relação de categoria do InvoiceDetail
objeto, que não existe.
->with('item', 'category')
Você deseja carregar o com Category
base na relação do item, não com base no InvoiceDetail
, tente a notação de ponto (visto que você definiu as outras relações)
->with('item.category')
As relações devem ser assim:
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');
}
}
Você gostaria de usar o hasManyThrough
se, por exemplo, tiver uma categoria e quiser carregar todos os detalhes da fatura diretamente.
dd($category->invoiceDetails);
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras