Laravel追加属性上的关系总和

时间:2018-09-06 09:13:12

标签: laravel model laravel-5.6

我有两个模型

这是我的材料模型:

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class material extends Model
{
    protected $fillable = ['proposal_id','thickness','width','length','qty','description'];
    public $timestamps = false;
    protected $appends = ['total'];
    public function proposal()
    {
        return $this->belongsTo(proposal::class);
    }
    public function getTotalAttribute()
    {
        return $this->qty * $this->price;
    }
}

这是我的建议模型:

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class proposal extends Model
{
    public function materials()
    {
        return $this->hasMany(material::class);
    }
}

我正在尝试从作为附加属性的total属性获取所有带有摘要的投标。

这不起作用:

\App\proposal::with(['materials'=>function($q){
    $q->sum('total');
    }])
    ->get();

如何正确执行? 谢谢

1 个答案:

答案 0 :(得分:0)

您代码的$q->sum('total')部分正在执行数据库查询,而您的total属性是在模型上而不是在数据库中生成的。

对于快速解决方案,您可以在Proposal模型中添加一个附加属性,该属性计算所有材料的总和。您可能要小心处理,因为这样可能会遇到N + 1问题(https://laravel.com/docs/5.6/eloquent-relationships#eager-loading)。

接着,您可以在计算总数之前检查是否先加载了Materials关系。在模型内部,您可以通过$this->relationLoaded('materials')进行检查。

最后但更复杂的是,您可以编写一个自定义选择,该选择使用MySQL(或您使用的任何数据库)在查询期间生成总数。

希望有帮助吗?如果您想进一步讨论,请告诉我。