代码之家  ›  专栏  ›  技术社区  ›  DarkFenix

如何在一段有说服力的关系中得到另一个和的和

  •  0
  • DarkFenix  · 技术社区  · 7 年前

    我有亲戚 user->sales->detail_sales ,一个用户有一个或多个销售,一个销售有一个或多个详细信息。我想做的是通过 雄辩的 ,即每个用户的所有销售额的总和 sum(totaldetails) 用withCount计算的总数的。

    出售php

    public function detail()
    {
        return $this->hasMany(Detail:class);
    }
    
    
    public function user()
    {
        return $this->belongsTo('App\User');
    }
    

    详细销售

    public function sale()
    {
        return $this->belongsTo(Sale::class);
    }
    

    使用者

    public function sales()
    {
        return $this->hasMany(Sale::class );
    }
    

    我现在有这个问题

    return App\User::with(['sales' => function($query){
        // get total for detail_sales for sale
        $query->withCount(['detail as totaldetails' => function($que){
            $que->select(DB::raw('sum(subtotal)'));
        }]);
    }])->get();
    

    但我希望在用户模型中,有这样一个属性 销售总额 例如,这可能吗?

    @foreach($users as $user)
      {{ $user->salestotal}}
    @endforeach
    
    0 回复  |  直到 7 年前
        1
  •  1
  •   Jonas Staudenmeir    7 年前

    你可以用 withCount() 用一个 HasManyThrough 关系:

    class User extends Model
    {
        public function details()
        {
            return $this->hasManyThrough(Detail:class, Sale::class);
        }
    }
    
    return App\User::withCount(['details as salestotal' => function($query) {
        $query->select(DB::raw('sum(subtotal)'));
    }])->get();
    
    @foreach($users as $user)
        {{ $user->salestotal }}
    @endforeach
    
        2
  •  1
  •   IGP    7 年前

    为什么不直接使用 sum() 功能,因为它都在一个集合中?

    @foreach($users as $user)
        {{ $user->sales->sum('totaldetails') }}
    @endforeach
    
        3
  •  0
  •   Ghanshyam Nakiya    7 年前

    我希望这有助于:

        return App\User::with(['sales' => function($query){
         // get total for detail_sales for sale
            $query->withCount(['detail as totaldetails' => function($que){
           $que->select(DB::raw("SUM(subtotal) as salestotal"));
           }]);
        }])->get();