2013-10-25 39 views
1

我通常使用queryRow來獲得單個記錄。例如: -限制1應該與YiR中的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似乎從表格中檢索所有記錄並返回第一條記錄。

所以我認爲我們應該使用LIMIT 1,只要我們使用queryRow。例如: -

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

由於queryRow正在返回「第一行(在陣列中的計)的查詢結果的」,Yii的應自動添加限制。否則用戶將使用此查詢來獲取單個記錄,這會導致性能下降。

我的理解是正確的還是我錯過了什麼?

+0

是否有你不使用ActiveRecord的原因?但是從Yii的類引用中,你應該確實得到queryRow()的第一行。 – davey

+0

@davey使用數組比對象更容易。但在這裏,我給了一個簡化的查詢演示目的。 –

+0

因爲沒有'WHERE',所以它會提取所有的行,所以使用'limit 1'來獲取最新的報告 – 2013-10-25 10:23:20

回答

0

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()和其他改進。

相關問題