Steven0T 2018-01-08 23:34:33 5254次浏览 1条评论 2 1 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查到的结果:

713681-20180108232128051-243892917.png

但是AR查到的结果(只有13条):

713681-20180108232228097-548177357.png

自己观察下数据,就发现,将sql查出来的数据group by ID(ID是表的主键)后就得到了上面的13条记录,即,应AR连表查询的时候,会出现主键覆盖情况.

解决方案:

在select的时候,将主键select出来,并且起个新的字段名称,再查,就会发现,所有的数据都有了

713681-20180108232729176-1592747561.png

以上

觉得很赞
  • 评论于 2018-05-02 09:39 举报

    新人求解,您在join链表的时候没有写on,是怎么自动生成的呢

    2 条回复
    评论于 2018-05-04 09:27 回复

    文章之后都在这里更新了,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']);
    }
    

    这样去连

    评论于 2018-05-04 14:29 回复

    谢谢,昨天也看了下,了解了,

您需要登录后才可以评论。登录 | 立即注册