Laravel 追加属性的关系总和

Laravel relationship sum on appends attribute

我有两个模型

这是我的material模特:

<?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);
    }
}

我正在尝试从作为附加属性的总属性中获取所有带有摘要的提案。

这不起作用:

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

如何正确操作? 谢谢

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

要获得快速解决方案,您可以将附加属性添加到 Proposal 模型,该模型计算所有材料的总数。您将需要小心执行此操作,因为您可能 运行 进入 N+1 问题 (https://laravel.com/docs/5.6/eloquent-relationships#eager-loading)。

从这里开始,您可以在计算总数之前先检查是否已加载 Materials 关系?在您的模型中,您可以通过 $this->relationLoaded('materials').

检查

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

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