JOIN 和whereIN查询的使用场景
在写sql语句的时候,JOIN 和 whereIn 的应用场景
在不依赖模型的条件下,使用JOIN
- 在进行多表连接必须进行field字段的限制,不然二表的相同字段会进行覆盖,适用于同一个库
$data = $this->Db('A','A_A')->where($where)->alias('hb')
-> JOIN('B B_B', 'A_A.openid=B_B.openid
AND B_B.user_shop_id = A_A.user_shop_id','LEFT')
->field([
'A_A.id',
'A_A.user_shop_id',
'A_A.openid',
'A_A.mch_billno',
'A_A.total_amount',
'A_A.status',
'A_A.create_time',
'A_A.update_time',
'B_B.avatarUrl',
'B_B.nickName'
])
->page($page,$pageSize)
->select()
->toArray();警告
💡 注意:若两表存在同名字段(如 id、status),不显式指定字段前缀会导致后者覆盖前者,最终数据丢失或逻辑错误。
在取不同库数据,采用whereIN的查询方式,在进行map映射
$total = count($data);
$shopID = array_unique(array_column($data,'user_shop_id'));
$shopInfo = $this->Db('main','user_shop')
->whereIn("id" , $shopID)
->field('id,shop_name')
->select()
->toArray();
// 将数据进行映射
$shopMap = [];
foreach ($shopInfo as $item){
$shopMap[$item['id']] = $item;
}
foreach ($data as $item => $hb){
$data[$item]['shop_info'] = $shopMap[$hb['user_shop_id']] ?? null;
}警告
💡 说明:当涉及跨数据库查询时,原生 SQL 的 JOIN 可能受限(如 MySQL 不支持跨库 JOIN 或权限隔离),此时“分步查询 + 内存映射”是更安全、可控的方案。
重要
在使用 ThinkORM 进行复杂查询时,务必注意以下两点:
JOIN 查询必须显式指定字段来源,避免同名字段覆盖导致数据异常。
跨库关联应避免直接 JOIN,改用 whereIn 分步查询 + 数组映射,虽然多一次查询,但兼容性更好、逻辑更清晰。
ORM 虽然简化了数据库操作,但在性能与正确性之间仍需开发者权衡。明确场景、合理选择查询方式,才能避开“隐式陷阱”,写出健壮高效的代码。
版权所有
版权归属:念宇
