Laravel работает с отношениями, которые не связаны - PullRequest
0 голосов
/ 01 июля 2018

Учтите, у меня есть три модели: Subscription, Description и Expense.

Каждая подписка принадлежит описанию, и каждое описание имеет много расходов:

Модель Подписка:

public function description()
{
    return $this->belongsTo(Description::class);
}

Описание модели:

public function expenses()
{
    return $this->hasMany(Expense::class);
}

Модель Расход:

public function description()
{
    return $this->belongsTo(Description::class);
}

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

$subscription->load(['description.expenses' => function ($q) use (&$transactions, $subscription) {
    $transactions = $q->with('description')
        ->get());
}]);

Но когда я хочу проверить все расходы, которые были сделаны для всех подписок, я не уверен, как поступить. Я пытался использовать hasManyThrough, но я думаю, что это не сработает вообще, так как ни у моего Description, ни у Expense нет subscription_id. Я также не хочу устанавливать прямую связь для Subscription и Expense.

Какие-нибудь указатели, как получить все расходы, которые были сделаны для всех подписок? А точнее сумма всех расходов на все подписки?

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Я действительно мог бы сделать то же самое, что я уже писал:

Subscription::all()->load(['description.expenses' => function ($q) use (&$transactions) {
    $transactions = $q->get();
}]);
0 голосов
/ 01 июля 2018

Вы можете добавить атрибут к модели Subscription:

<?php
class Subscription extends Model {
    protected $appends = ['total_expenses'];

    ...

    public function totalExpenses()
    {
        return $this->description()
                    ->with(['expenses'])
                    ->get()
                    ->pluck('expenses.amount', 'amount')
                    ->sum('amount');
    }
}


// do something...
Subscription::all()->each->total_expenses
...