我有两个模型
这是我的材料模型:
<?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();
如何正确执行? 谢谢
答案 0 :(得分:0)
您代码的$q->sum('total')
部分正在执行数据库查询,而您的total
属性是在模型上而不是在数据库中生成的。
对于快速解决方案,您可以在Proposal
模型中添加一个附加属性,该属性计算所有材料的总和。您可能要小心处理,因为这样可能会遇到N + 1问题(https://laravel.com/docs/5.6/eloquent-relationships#eager-loading)。
接着,您可以在计算总数之前检查是否先加载了Materials
关系。在模型内部,您可以通过$this->relationLoaded('materials')
进行检查。
最后但更复杂的是,您可以编写一个自定义选择,该选择使用MySQL(或您使用的任何数据库)在查询期间生成总数。
希望有帮助吗?如果您想进一步讨论,请告诉我。