Получить сумму заработка всех платежей для пользователя? - PullRequest
0 голосов
/ 13 января 2020

Пользователь → имеет много → Книга → имеет много → Заказ → имеет много Оплата

в книге Модель:

public function payments()
{
   return $this->hasManyThrough(Payment::class, Order::class);
}

Таблица заказов

 Schema::create('orders', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('user_id');
            $table->unsignedBigInteger('book_id');
            $table->unsignedInteger('amount');

            $table->foreign('user_id')->references('id')->on('users');
            $table->foreign('book_id')->references('id')->on('books');
        });

Миграция платежей:

 Schema::create('payments', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('order_id');
            $table->string('payment_method');
            $table->unsignedInteger('author_earning');

            $table->foreign('order_id')->references('id')->on('orders');
        });
    }

Моя проблема: Я хочу перечислить всех пользователей с суммой author_earning для всех платежей, которые принадлежат их книгам . Я пытался сделать что-то вроде:

$users = User::with(['books.payments' => function ($query) {
            $query->sum('instructor_earning');
        }])
        ->whereHas('books.payments')
        ->get();

Но не повезло. Как я могу решить это?

1 Ответ

0 голосов
/ 13 января 2020

Поскольку при использовании со многими отношениями закрытию необходимо получить как минимум столбцы 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}]        
    }]
  }]
}]      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...