2013-02-08 76 views
2

我需要從Yii CActiveRecord派生類中獲取第一條記錄。在Rails我只想能夠做到這一點:Yii CActiveRecord類是否有first()方法?

post = Post.first 

我想我可以做同樣的事情與誼這樣的:

$post = Post::model()->first(); 

但是這種方法不存在。我必須找到一個條件才能獲得第一個記錄嗎?

我沒有在CActiveRecord的文檔中看到first(),所以我假設答案是否定的,它沒有第一個方法。那麼,如何才能查詢第一條記錄呢?

這個工程,但肯定是一個醜陋的黑客。當然有更好的方法。

$first = Post::model()->findAll(array('order'=>id, 'limit'=>1)); 

回答

3

CActiveRecord::find()只返回一個模型。

$first=Post::model()->find(); 
+0

這正是我想要的。在有問題的表格中,它應該只有一個記錄(我沒有設計這個)。 – andrunix 2013-02-08 20:56:31

7

Yii不會對數據應該如何排序做任何假設。良好的數據庫設計要求,如果使用代理鍵,該鍵應該具有無意義的價值。這意味着不要使用它來訂購。

這個問題不談,這裏可能是做您的查詢的最佳方式:

$first = Post::model()->find(array('order'=>'id ASC')); 

通過使用find代替findAll您自動將LIMIT 1到您的結果。我不會跳過包含order by子句,因爲這可以確保數據庫能夠一致地排列結果。

如果您使用此查詢很多,您可以創建以下方法。 UPDATE:修改它以在primaryKey爲複合或丟失時引發異常。我們也可以添加更多的錯誤檢查,但我們將其作爲讀者的練習。 )

public function first($orderBy = null){ 
    if(!$orderBy){ 
     $orderBy = self::model()->tableSchema->primaryKey; 
    } 
    if(!is_string($orderBy)){ 
     throw new CException('Order by statement must be a string.'); 
    } 
    return self::model()->find(array('order'=>$orderBy)); 
} 

然後包括其中延伸的CActiveRecord一類該方法,然後延伸所有模型形成類。

我寫的包裝將默認按主鍵排序結果,但如果您願意,您可以選擇傳遞不同的列和方向(ASC或DESC)。

然後,如果你這樣做了後級,您可以訪問的第一款車型,像這樣:

$first = Post::model()->first(); 
+0

感謝威廉。這是一個很好的解釋! – andrunix 2013-02-08 20:55:54

+1

這個包裝函數非常漂亮。但是,如果您的主鍵是複合鍵,它將不起作用。 – topher 2013-02-08 21:08:09

+1

@topher好點。我修改了我的方法來涵蓋這種情況。 – 2013-02-08 22:31:10