Поскольку при использовании со многими отношениями закрытию необходимо получить как минимум столбцы eloquent Builder, в том числе foreign_key, eloquent использует этот ключ Foreign_key для создания вложенной коллекции.
Однако сумма вернет число , а не красноречивые столбцы;
, поэтому, если вы сложите сумму author_earning платежа для каждой книги, вы можете использовать средство доступа,
Сделайте это следующим образом, в модели «Книга»:
protected $appends = ['author_earning'];
public function getAuthorEarningAttribute()
{
$sum = Book::where('books.id', $this->id)
->join('orders', 'orders.book_id', '=', 'books.id')
->join('payments', 'payments.order_id', '=', 'orders.id')
->groupBy('books.id')
->selectRaw('books.id, SUM(payments.amount) AS sum')
->first()->sum;
return $sum;
}
Так что, когда вы платите за книги следующим образом:
$users = User::with(['books.payments'])
->whereHas('books.payments')
->get()->toJson();
, вы получите следующие данные:
[{"id":1,
"username":"Tom",
"books":[{
"id":1,
"title": "Tom and Jerry",
"author_earning": 18,
"orders": [{
"id":1,
"number": "FA00000001"
"payments": [{"id":1,"author_earning":15},{"id":2,"author_earning": 3}]
},{
"id":2,
"title": "Dragon Ball",
"author_earning": 2,
"orders": [{
"id":2,
"number": "FA00000002"
"payments": [{"id":1,"author_earning":2}]
}]
}]
}]