复杂的子查询统计在 ORM 中怎么优雅的写出来

    //获取今日收礼的礼物钻石价值
    public function getCharm($member_id)
    {
//        RoomGiftRecord::query()
//            ->whereRaw("")

        $sql = <<<eof
            SELECT SUM(diamonds) as diamonds_sum FROM (
                SELECT gift_id,
                (SELECT diamonds FROM goods_gift where goods_gift.id = room_gift_record.gift_id) as diamonds
                FROM room_gift_record WHERE member_id=?
            ) as t
eof;


        $data = DB::select($sql, [$member_id]);


        return $data[0]->diamonds_sum;

    }

这么复杂的子查询在orm中能优雅的写出来吗~

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

先说说问题,表设计错误,这类数据应当冗余在记录表内,形成数据差异化。 你的表和字段都没有告知,仅凭你贴出来的代码,完完全全就是简单的一对多,with或load使用select然后再使用DB::raw就可以使用原生聚合函数了

4年前 评论
Siam (作者) 4年前
Chenhappy (楼主) 4年前
Chenhappy (楼主) 4年前
讨论数量: 4
游离不2

跨表了基本很难优雅了

4年前 评论

先说说问题,表设计错误,这类数据应当冗余在记录表内,形成数据差异化。 你的表和字段都没有告知,仅凭你贴出来的代码,完完全全就是简单的一对多,with或load使用select然后再使用DB::raw就可以使用原生聚合函数了

4年前 评论
Siam (作者) 4年前
Chenhappy (楼主) 4年前
Chenhappy (楼主) 4年前

房间礼物流水

room_gift_record

CREATE TABLE `room_gift_record`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `room_id` bigint(20) NOT NULL COMMENT '房间id',
  `member_id` bigint(20) NOT NULL COMMENT '送礼物的人',
  `to_member_id` bigint(20) NOT NULL COMMENT '接收礼物的人',
  `diamond_record_id` bigint(20) NOT NULL COMMENT '钻石账户变化流水id',
  `gift_id` bigint(20) NOT NULL COMMENT '礼物id',
  `gift_data` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '礼物数据快照',
  `created_at` timestamp(0) NULL DEFAULT NULL,
  `updated_at` timestamp(0) NULL DEFAULT NULL,
  `deleted_at` timestamp(0) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2526 CHARACTER SET = utf8mb4 

goods_decorate 装饰礼物表

CREATE TABLE `goods_decorate`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `diamonds7` int(255) NULL DEFAULT NULL COMMENT '7天价格',
  `diamonds15` int(255) NULL DEFAULT NULL COMMENT '15价格',
  `image` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `svga_resource` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '资源文件',
  `type` int(255) NULL DEFAULT NULL COMMENT '1头饰 2座驾 3聊天',
  `soft` int(255) NULL DEFAULT NULL,
  `created_at` timestamp(0) NULL DEFAULT NULL,
  `updated_at` timestamp(0) NULL DEFAULT NULL,
  `deleted_at` timestamp(0) NULL DEFAULT NULL,
  `buy_type` int(11) NULL DEFAULT NULL COMMENT '消费类型 1是钻石 2金币类型 ',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 20 CHARACTER SET = utf8mb4 
4年前 评论
class RoomGiftRecord extends Model
{
     //一个礼物对应一种商品类型
      public function GoodsGift()
      {
            return $this->belongsTo(GoodsGift::class,'gift_id','gitf_id');
      }
}

$record = RoomGiftRecord::where('member_id',$member_id)
           ->with('GoodsGift:id,gift_id,diamonds')
           ->whereDate('created_at',today())
           ->get();

$record->pluck('GoodsGift')->flatten()->sum('diamonds'); //统计当前用户礼物所得
$record->pluck('GoodsGift')->flatten()->avg('diamonds');//求平均
4年前 评论
Chenhappy (楼主) 4年前
Chenhappy (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!