Yii2 联表查询数据丢失,即出现主键覆盖情况的解决方法 [ 2.0 版本 ]
前段时间做项目,遇到一个问题,用yii2的AR连表查询数据的时候,理应该查出来更多的数据,但是实际得到的只有部分数据:
例如,有这么一个查询:
$query = OperaHotelRoom::find()
->select(['a.ID','a.ROOM_NAME','a.PARENT_ROOM_TYPE'])
->joinWith('runHotel b')
->from('opera_hotel_room a')
->where(['a.HOTEL_ID' => 197]);
$sql = $query->createCommand()->getRawSql();
$res = $query->asArray()->all();
这里的连表中主表个字表的关系是一对多,打出的,写成原生sql:
SELECT `a`.`ID`,`a`.`ROOM_NAME`,`a`.`PARENT_ROOM_TYPE`
FROM `opera_hotel_room` `a`
LEFT JOIN `run_hotel` `b` ON `a`.`HOTEL_ID` = `b`.`HOTEL_ID` AND `a`.`PARENT_ROOM_TYPE` = `b`.`BASE_ROOM_TYPE`
WHERE `a`.`HOTEL_ID` = 197
原生sql查到的结果:
但是AR查到的结果(只有13条):
自己观察下数据,就发现,将sql查出来的数据group by ID(ID是表的主键)后就得到了上面的13条记录,即,应AR连表查询的时候,会出现主键覆盖情况.
解决方案:
在select的时候,将主键select出来,并且起个新的字段名称,再查,就会发现,所有的数据都有了
以上
Steven0T 上海
注册时间:2017-09-22
最后登录:2025-02-12
在线时长:28小时34分
最后登录:2025-02-12
在线时长:28小时34分
- 粉丝10
- 金钱2970
- 威望160
- 积分4850
共 1 条评论
新人求解,您在join链表的时候没有写on,是怎么自动生成的呢
文章之后都在这里更新了,http://shifpeng.cn/?p=354
另外,你说的这个问题,说明 你还没有了解YII2中的连表,leftJoin的时候会有on条件,但是如果用joinWith的话,你需要
public function getRunHotel() { return $this->hasMany(RunHotel::className(), ['HOTEL_ID' => 'HOTEL_ID', 'BASE_ROOM_TYPE' => 'PARENT_ROOM_TYPE']); }
这样去连
谢谢,昨天也看了下,了解了,