2011-06-29 88 views

回答

13

作用域是默認情況下創建簡單過濾器的簡單方法。用示波器可以自動將結果通過特定的列進行排序,結果限制,申請條件等,但通過@ldg還有他們是如何的酷大的示例中提供的鏈接:

$posts=Post::model()->published()->recently()->findAll(); 

有人在檢索全部最近發佈的帖子在一行中。它們比內聯條件更容易維護(例如Post::model()->findAll('status=1')),並且封裝在每個型號內,這意味着透明度和易用性。

另外,你可以創建自己的基於參數的範圍是這樣的:

public function last($amount) 
{ 
    $this->getDbCriteria()->mergeWith(array(
     'order' => 't.create_time DESC', 
     'limit' => $amount, 
    )); 
    return $this; 
} 

添加像這樣到模型中會讓你選擇你想從數據庫中檢索對象的量(排序其創造時間)。 通過返回對象本身,您允許方法鏈接。

下面是一個例子:

$last3posts=Post::model()->last(3)->findAll(); 

獲取最後3項。當然,您可以將示例擴展到數據庫中的幾乎任何屬性。乾杯

+0

但我已經問過如何使用CDbCriteria作用域,而不是CActiveRecord作用域。以及如何用params來使用它們。 – RusAlex

+0

CActiveRecord作用域實際上受CDbCriteria更改的影響,而CDbCriteria作用域實際上會過濾CActiveRecord記錄。 CDbCriteria是一種封裝數據庫結果條件的方法。所以我沒有發現任何區別。如果您改變主意並查看大代碼塊,則last()函數是一個帶參數的自定義作用域。 – Korcholis

4

是的,範圍可以用來改變CDbCriteria的屬性與預建條件,也可以通過參數。在1.1.7之前,你可以在模型()查詢中使用它們,並可以鏈接在一起。請參閱: http://www.yiiframework.com/doc/guide/1.1/en/database.ar#named-scopes

從1.1.7開始,您還可以將作用域作爲CDbCriteria屬性使用。 請參閱:http://www.yiiframework.com/doc/guide/1.1/en/database.arr#relational-query-with-named-scopes

+0

你能告訴我使用的例子嗎?我試了一下自己,但我無法找到一種方法來改變模型範圍內的參數與標準範圍屬性「即時」。 – RusAlex

相關問題