我到处寻找,无法找到这个令人费解的问题的答案..
我可以使用Criteria做几乎所有事情(虽然它可能看起来像代码一样糟糕),就像我可以用createCommand做的那样。
所以我的问题是:是否存在性能差异,还是只有两种方法可以获得相同的结果?
答案 0 :(得分:4)
CDbCriteria& createCommand都是在Yii框架中创建查询的方法。除此之外,您需要直接运行mysql查询而不使用这些方法。
使用CDbCriteria创建复杂查询非常简单,并且比createCommand更好 而你需要使用关系来运行连接操作。
但是在性能基础上,createCommand比CDbCriteria更好,因为CDbCriteria执行一些模式级查询来获取表列并为每个表执行,每次我们使用CDbCriteria。虽然createCommand直接执行mysql查询,但它不需要运行模式级查询。
当您开始缓存查询而非性能级别时,两者几乎相似。
关于CDbCriteria的一个更好的功能是它的关系查询。所以我更喜欢使用CDbCriteria和让yii以自己的方式处理查询。
答案 1 :(得分:2)
CDbCriteria恰好是某种CDbConnection(通常是DAO)功能的一种封装。例如,在ActiveRecord模型中,大多数查询函数(如find()和similars)使用CDbCriteria对象初始化CommandBuilder实例。这样,性能存在实际差异,因为使用CDbcriteria实际上需要一些php执行来生成db命令。但我必须说,这不是毫无意义的; reference告诉我们:
虽然Yii DAO几乎可以处理任何与数据库相关的任务,但我们可能会花90%的时间编写一些执行常见CRUD(创建,读取,更新和删除)操作的SQL语句。当它们与SQL语句混合时,也难以维护我们的代码。要解决这些问题,我们可以使用Active Record。