首页 > 解决方案 > 单个查询中关系列的雄辩总和

问题描述

在这个查询中,我有三个表,例如radioradio_channels其中radio_channels_files我想计算一个列,该radio_channels_files列作为新列进入表中duration_sum,我下面的代码工作,但我无法计算这一列

class Radio extends Model
{
    use SoftDeletes;

    protected $guarded = ['id'];
    protected $casts = [
        'logo_path' => 'array',
        'cover_path' => 'array'
    ];

    public function category()
    {
        return $this->belongsTo(RadioCategory::class);
    }

    public function channels()
    {
        return $this->hasMany(RadioChannels::class);
    }
}
    

class RadioChannelsFiles extends Model
{
    protected $guarded = ['id'];

    protected $casts = [
        'image' => 'array',
        //'keywords' => 'array',
    ];

    public function channel()
    {
        return $this->belongsTo(RadioChannels::class,'playlist_id');
    }
}

   

class RadioChannels extends Model
{
    protected $guarded = ['id'];

    protected $casts = [
        'image' => 'array'
    ];

    public function channel()
    {
        return $this->belongsTo(Radio::class);
    }

    public function files()
    {
        return $this->hasMany(RadioChannelsFiles::class , 'playlist_id');
    }

    public function duration_sum()
    {
        return $this->hasOne(RadioChannelsFiles::class ,'playlist_id')
            ->select('duration',
                DB::raw('sum(duration)')
            )->groupBy('duration');
    }
}


$channels = Radio::with(['category', 'channels' => function ($query) {
    $query->with(['files','duration_sum']);
}])->paginate(50);

我得到null输出:

#relations: array:2 [▼
     "files" => Illuminate\Database\Eloquent\Collection {#1422 ▶}
     "duration_sum" => null //should return sum of duration from files
     ]

标签: laraveleloquent

解决方案


我知道我怎么能得到它

public function getRadiosList(Request $request)
{
    $radios = Radio::with(['category', 'playLists' => function ($query) {
        $query->with(['files','duration_sum']);
    }])->get();

    return response()->json(['data' => $radios, 'statusCode' => 1], 200);
}

模型:

public function duration_sum()
{
    return $this->hasOne(RadioPlaylistsFiles::class, 'playlist_id')
        ->select('playlist_id',
            DB::raw('sum(duration) as `all_duration`')
        )->groupBy('playlist_id');
}

推荐阅读