CodeIgniter 4 Query Builder关联查询失效,如何获取关联实体名称?
CodeIgniter 4 关联查询获取部门对应实体名称的正确写法
问题背景
现有两张数据表:
Entities(实体表)
| id | name | is_freezone |
|---|---|---|
| 1 | ABC LTD | 0 |
| 2 | A & B LLC | 0 |
| 3 | C & D LLC | 0 |
Divisions(部门表)
| id | name | entity_id |
|---|---|---|
| 1 | TOYS | 2 |
| 2 | FOOD | 2 |
| 3 | HOUSEHOLD | 3 |
需要查询得到如下格式的结果:
| id | name | entity_name |
|---|---|---|
| 1 | TOYS | A & B LLC |
| 2 | FOOD | A & B LLC |
| 3 | HOUSEHOLD | C & D LLC |
原CodeIgniter 4代码如下,但未返回预期结果:
$db = \Config\Database::connect(); $builder = $db->table('divisions'); $builder->select('*'); $builder->join('entities', 'divisions.entity_id = entities.id'); $query = $builder->get()->getResult();
问题原因
使用select('*')会同时查询两张表的所有字段,导致:
- 两张表的
id和name字段重复,结果集中只会保留最后一个同名字段的值(比如id会变成实体表的id,而非部门表的id) - 没有将实体表的
name字段重命名为entity_name,不符合预期的结果字段名
解决代码
明确指定需要查询的字段,给实体表的name起别名entity_name,同时通过表前缀区分同名字段:
$db = \Config\Database::connect(); $builder = $db->table('divisions'); // 指定需要的字段,给实体名称起别名,避免字段冲突 $builder->select('divisions.id, divisions.name, entities.name AS entity_name'); $builder->join('entities', 'divisions.entity_id = entities.id'); $query = $builder->get()->getResult();
说明
上述代码会精准返回部门表的id、name,以及实体表的name(别名为entity_name),完全匹配预期的结果格式。如果需要保留实体表的其他字段,也可以在select中添加,比如entities.is_freezone。
内容的提问来源于stack exchange,提问作者sarath_kanam
相关产品推荐
相关产品推荐

