Laravel处理与arent相关的关系

时间:2018-07-01 05:49:27

标签: laravel relation

考虑到我有三个模型:SubscriptionDescriptionExpense

每个订阅都属于一个描述,每个描述都有很多费用:

模型订阅:

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。我也不想为SubscriptionExpense建立直接关系。

任何指针如何获取所有订阅的所有费用?还是所有订阅的所有费用之和?

2 个答案:

答案 0 :(得分:1)

您可以在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

答案 1 :(得分:0)

我实际上可以做与已经发布的相同的事情:

Subscription::all()->load(['description.expenses' => function ($q) use (&$transactions) {
    $transactions = $q->get();
}]);