模型关联查询问题

业务逻辑 -实现结果统计每个中心里有几个房间 并且作出条件筛选

##目标sql语句


    中心表core 房间表 room  branchId 关联ID 

    SELECT a.*,(
    SELECT COUNT(*) FROM room b where b.branchId = a.branchId
    ) roomNumber 
    FROM  core a HAVING roomNumber >= 2(房间数量);

laravel代码

        目前通过手册已经关联了模型 但是找不到生成上方sql语句的方法

        关联模型代码  中心模型中 core
        public function getBatchRoom()
        {
            return $this->hasOne(RoomDaoImpl::class,'branchId','branchId');
        }

        查询代码
        $testData = $this->getCoreDao()->with(
        ['getBatchRoom' => function ($query) {
            return $query->count('*');}
        ])->get()->toArray();

        传入id 1 此时日志中生成的sql语句为
        select * from `room` where `room`.`branchId` in ('1')
        个人理解为此时两张表已经产生了关联 但是并没有生成我想要的sql语句
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
66
最佳答案

楼上正解 稍微优化下

$testData = $this->withCount('getBatchRoom as batch_room_count')
                 ->having('batch_room_count','>',13)
                 ->get()->toArray();
2年前 评论
AKA小居 (楼主) 2年前
讨论数量: 4

可以直接用laravel 的withCount统计

$this->select([
                "*"
            ])
            ->withCount("getBatchRoom")
            ->having("get_batch_room_count",">",13)
            ->get()->toArray();
2年前 评论
小猪蹄子 (作者) 2年前
AKA小居 (楼主) 2年前
AKA小居 (楼主) 2年前
AKA小居 (楼主) 2年前
66

楼上正解 稍微优化下

$testData = $this->withCount('getBatchRoom as batch_room_count')
                 ->having('batch_room_count','>',13)
                 ->get()->toArray();
2年前 评论
AKA小居 (楼主) 2年前

上面方式当数据量很大时或列表存在更多筛选条件时会出现阻塞 最直接简单的解决方式 增加数据库冗余字段 记录房间的个数到中心 感谢某位牛提点@

2年前 评论
$lists =$this->has('getBatchRoom', '>=', 13)->get();
2年前 评论

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