【问题标题】:Laravel relationship sum on appends attribute附加属性上的 Laravel 关系总和
【发布时间】:2019-02-11 12:18:39
【问题描述】:

我有两个模型

这是我的材质模型:

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

如何正确地做到这一点? 谢谢你

【问题讨论】:

标签: laravel model laravel-5.6


【解决方案1】:

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

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

接下来,您可以在计算总数之前检查是否已先加载 Materials 关系?在您的模型中,您可以通过$this-&gt;relationLoaded('materials') 进行检查。

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

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

【讨论】:

  • 谢谢你!答案是我们不能对附加属性求和,所以我们需要像你说的那样创建自定义查询
猜你喜欢
  • 2019-02-10
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 2021-12-10
  • 2015-01-31
相关资源
最近更新 更多