【问题标题】:Limit 1 should be used with queryRow in Yii?限制 1 应该与 Yii 中的 queryRow 一起使用吗?
【发布时间】:2013-10-25 10:19:08
【问题描述】:

我通常使用queryRow 来获取一条记录。例如:-

$lastReport =  Yii::app()->db->createCommand(
    'SELECT * FROM report ORDER BY created DESC'
)->queryRow();

我查看了 MySQL 日志以了解它使用了哪个查询。

SELECT tbl_report.* FROM report ORDER BY created DESC

好像Yii正在从表中检索所有记录并返回第一条记录。

所以我认为我们应该在使用queryRow 时使用LIMIT 1。例如:-

$lastReport =  Yii::app()->db->createCommand(
    'SELECT * FROM report ORDER BY created DESC LIMIT 1'
)->queryRow();

由于queryRow 正在返回“查询结果的第一行(以数组形式)”,Yii 应该自动添加限制。否则用户将使用此查询来获取单个记录,这将导致性能下降。

我的理解是正确的还是我遗漏了什么?

【问题讨论】:

  • 您没有为此使用 ActiveRecord 有什么原因吗?但是从 Yii 的类引用中,您确实应该使用 queryRow() 获得第一行。
  • @davey 使用数组比使用对象更容易。但在这里我给出了一个简化的查询,用于演示目的。
  • 由于没有WHERE,它似乎获取了所有行,所以使用limit 1获取最新报告
  • 我明白,我认为 LIMIT 1 可以使用,因为如果你只想要一个,就不需要获取所有行。

标签: sql yii


【解决方案1】:

Yii 不应该在查询中添加limit 1,因为queryRow 旨在逐行获取结果,例如在while 中。 Yii 对原始 SQL 代码的功能有限,但可以使用查询生成器:

$user = Yii::app()->db->createCommand()
->select('id, username, profile')
->from('tbl_user u')
->join('tbl_profile p', 'u.id=p.user_id')
->where('id=:id', array(':id'=>$id))
->queryRow();

更多信息在这里:http://www.yiiframework.com/doc/guide/1.1/en/database.query-builder

您应该使用ActiveRecordClassName::model()->findByPk($id);ActiveRecordClassName::model()->find($criteria),因为它使用了defaultScope() 和其他改进。

【讨论】:

    猜你喜欢
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    相关资源
    最近更新 更多