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(或您正在使用的任何数据库)在查询期间生成总数。
希望对您有所帮助?如果您想进一步讨论,请告诉我。
我有两个模型
这是我的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(或您正在使用的任何数据库)在查询期间生成总数。
希望对您有所帮助?如果您想进一步讨论,请告诉我。