我的查询当前遇到问题
TableA::find()
->select('*')
->joinWith(['TableB'])
->joinWith(['TableC'])
->joinWith(['TableD'])
->where([TableA.attribute1=1 or TableA.attribute2=1])
->andWhere([(further possible conditions on the other Tables)])
->all()
SQL查询的通常执行顺序是From (with joins)
,然后是where
。
是否有办法在连接之前执行第一个where条件,以减少连接行的数量?
TableA::find()
->where([TableA.attribute1=1 or TableA.attribute2=1])
->select('*')
->joinWith(['TableB'])
->joinWith(['TableC'])
->joinWith(['TableD'])
->andWhere([(further possible conditions on the other Tables)])
->all()
2条答案
按热度按时间iezvtpos1#
可以修改用于联接表的条件。
在SQL中,它看起来像这样:
在Yii中,你可以使用
ActiveQuery::onCondition()
方法来实现。如果你只想对这一个查询应用这个条件,你可以在joinWith()
方法中使用callback来修改用于连接的查询。另一个选项是在sql查询的FROM部分使用子查询,如下所示:
于易:
这种方法的主要缺点是子查询中的临时表没有任何索引,因此连接和其他条件的执行速度会比较慢。如果tableA有很多行,而您希望在连接前应用的条件会显著减少行数,那么使用这种方法可能还是值得的。
ct2axkht2#
好吧,我认为这是最好的方法。但是如果你不打印来自关系
TableB
或TabelC
的数据(你只得到关于where条件的数据),你可以这样设置关系: