如何使用CodeIgniter QueryBuilder编写指定复杂SQL查询
用CodeIgniter QueryBuilder实现指定SQL查询
没问题,我来帮你把这条原生SQL转换成CodeIgniter的QueryBuilder写法,这样既符合框架规范,也更便于维护和后续修改。我会分别给出CodeIgniter 3和CodeIgniter 4的实现方式,你可以根据自己使用的版本选择:
CodeIgniter 3 实现方式
// 先构建子查询:获取每个邮箱对应的最大clientid $subquery = $this->db->select_max('clientid') ->from('client') ->group_by('email') ->get_compiled_select(); // 主查询构建 $this->db->select('client.fname, client.lname, client.email, client.phone, activities.activitydescription, package.PackageName, reservationyurt.arrvdate') ->from('client') // 内连接activities表 ->join('activities', 'client.activityid = activities.activityid', 'inner') // 内连接package表 ->join('package', 'client.packageid = package.packageid', 'inner') // 内连接reservationyurt表 ->join('reservationyurt', 'client.packageid = reservationyurt.packageid', 'inner') // 筛选指定邮箱 ->where('client.email', 'tr@gmail.com') // 筛选clientid在子查询结果中,第三个参数false避免框架转义子查询SQL ->where_in('client.clientid', $subquery, false); // 执行查询并获取结果 $result = $this->db->get()->result();
CodeIgniter 4 实现方式
CI4的QueryBuilder API略有调整,写法如下:
// 初始化数据库连接 $db = \Config\Database::connect(); // 构建子查询 $subquery = $db->table('client') ->selectMax('clientid') ->groupBy('email') ->getCompiledSelect(); // 主查询构建 $query = $db->table('client') ->select('client.fname, client.lname, client.email, client.phone, activities.activitydescription, package.PackageName, reservationyurt.arrvdate') // CI4默认使用INNER JOIN,可省略第三个参数 ->join('activities', 'client.activityid = activities.activityid') ->join('package', 'client.packageid = package.packageid') ->join('reservationyurt', 'client.packageid = reservationyurt.packageid') ->where('client.email', 'tr@gmail.com') ->whereIn('client.clientid', $subquery, false); // 执行查询并获取结果 $result = $query->get()->getResult();
关键细节说明
- 所有字段都明确指定了所属表名,避免多表连接时出现字段名冲突的问题;
- 子查询通过
get_compiled_select()(CI3)或getCompiledSelect()(CI4)生成原生SQL字符串,再传入where_in/whereIn方法; where_in的第三个参数设为false,是为了告诉框架不要将子查询当成普通字符串进行转义,确保子查询能正确执行。
内容的提问来源于stack exchange,提问作者Aditya B
相关产品推荐
相关产品推荐

