Yii2 ActiveQuery 加入保持返回不同的值

Posted

技术标签:

【中文标题】Yii2 ActiveQuery 加入保持返回不同的值【英文标题】:Yii2 ActiveQuery join keep returns distinct values 【发布时间】:2016-07-06 04:14:48 【问题描述】:

我有两张如下表

餐桌暂停:

CREATE TABLE `halte` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nama` varchar(255) NOT NULL,
  `lat` float(10,6) DEFAULT NULL,
  `lng` float(10,6) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

桌站:

CREATE TABLE `stops` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_halte` int(11) DEFAULT NULL,
  `sequence` int(2) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `id_halte` (`id_halte`)
)

我还有一些其他的表不会引起任何问题。

Halte 表有多对一的关系要停止。问题是当我尝试使用右连接从停止表中获取行时,Yii 只返回唯一行。一旦停止表有多个与halte表中的同一行相关的记录,Yii也不会返回相同的halte行。

这是我的代码

$haltes = $modelHalte->find()
                    ->rightJoin('stops', 'halte.id = stops.id_halte')
                    ->where(['stops.id_rute'=>Yii::$app->request->get('rute')])
                    ->orderBy('sequence')
                    ->all();

我试过distinct(false),但没有结果。 我还检查了调试器,它运行了我想要的正确查询:

SELECT `halte`.* FROM `halte` RIGHT JOIN `stops` ON halte.id = stops.id_halte WHERE `stops`.`id_rute`='1' ORDER BY `sequence`

我尝试手动运行该查询,它返回了 29 行,这正是我想要的。但是在 Yii 中,它只返回了 27 行,因为 2 行是 Halte 表中的同一条记录。

我知道我可以使用yii\db\Query 来实现这一点,但我想使用 ActiveRecord。

有没有办法解决这个问题? 非常感谢您的意见/帮助。 谢谢。

【问题讨论】:

【参考方案1】:

检查你主动查询生成的sql命令

$haltes = $modelHalte->find()
                ->rightJoin('stops', 'halte.id = stops.id_halte')
                ->where(['stops.id_rute'=>Yii::$app->request->get('rute')])
                ->orderBy('sequence')
                ->all();

 echo $haltes->createCommand()->sql;

或获取包含所有参数的 SQL 尝试:

 $haltes->createCommand()->getRawSql();

并将 ActiveQuery 生成的代码与您手动创建的代码进行比较..

【讨论】:

我认为您在没有 ->all() 的情况下说过。它返回SELECT 'halte'.* FROM 'halte' RIGHT JOIN 'stops' ON stops.id = stops.id_halte WHERE 'stops'.'id_rute'=:qp0 ORDER BY 'sequence' 它仍然忽略相同的记录。当我手动运行它时,它返回 31 行,但 yii 只返回 28 行。 没有 ->all().. 是什么意思?您应该使用 all() 测试您执行的完全相同的查询 .. 如果我插入 ->all(); 会抛出 Call to a member function createCommand() on a non-object 异常; 好的……我想的是第一个样本而不是第二个。那么如果查询相同,可能是您在 .qp0 与您在测试中使用的值有一些差异(例如:空格或一些不可见的字符).. 不,它只是数字 1 表示路由 ID。当我尝试第二个样本时,它也是 id_rute=1

以上是关于Yii2 ActiveQuery 加入保持返回不同的值的主要内容,如果未能解决你的问题,请参考以下文章

Yii2:ActiveQuery 示例以及在 Gii 中单独生成 ActiveQuery 类的原因是啥?

Yii2设计模式——静态工厂模式

Yii2 设计模式——静态工厂模式

Yii2 中的 $with 和 $joinWith 有啥区别以及何时使用它们?

Yii2 - ActiveRecord 到数组

Yii2学习笔记之场景