2015-04-24 16 views
5

Làm thế nào để sử dụng bộ đệm ActiveRecotd cho Yii 2? Tôi không tìm thấy bất kỳ ví dụ nào trong tài liệu chính thức. Trong Google, tôi đã tìm thấy 2 ví dụ, trước tiên là:Yii2 ActiveRecord cache

$db = self::getDb(); 
$object = $db->cache(function ($db) use($id) { 
    return self::findOne($id); 
}); 

Nhưng nó không hoạt động cho Model, tôi đã thử nghiệm với khung được cập nhật. Ví dụ khác là:

$data = \Yii::$app->cache->get('some_var_' . $id); 
if ($data === false) 
{ 
    $data = self::findOne($id); 
    \Yii::$app->cache->set('some_var_' . $id, $data, 60); 
} 

Nó làm việc tốt, nhưng nó không ActiveRecord bộ nhớ đệm đó là dữ liệu bộ nhớ đệm, Vì vậy, chúng tôi vẫn chưa nhận được ActiveRecord bộ nhớ đệm trong Yii 2?

Trả lời

6

1) Sử dụng bộ nhớ cache như thế:

$db = Yii::$app->db;// or Category::getDb() 
$result = $db->cache(function ($db) use ($id) { 
    return Category::find()->where(['id' => $id])->all(); 
}, CACHE_TIMEOUT); 

2) Nếu bạn có thể sử dụng phụ thuộc truy vấn, sử dụng như thế:

$db = Yii::$app->db;// or Category::getDb() 
$dep = new DbDependency(); 
$dep->sql = 'SELECT count(*) FROM category'; 
$result = $db->cache(function ($db) use ($id) { 
    return Category::find()->where(['id' => $id])->all(); 
}, CACHE_TIMEOUT, $dep); 
2

tôi cũng đang gặp khó khăn với điều này. Đây là cách giải quyết của tôi trong thời gian cho một mối quan hệ hasOne().

public function getGroup() 
{ 
    if(isset(static::$_getGroup[$this->id])) { 
     return static::$_getGroup[$this->id]; 
    } 
    $Group = $this->hasOne(BillChargesGroup::className(), ['id' => 'group_id'])->one(); 
    static::$_getGroup[$this->id] = $Group; 
    return $Group; 
} 

Tôi chỉ muốn lưu dữ liệu cho yêu cầu hiện tại, vì vậy, thao tác này hoạt động. Tuy nhiên vì tôi đang sử dụng ->one(); nó không trả lại đối tượng ActiveQuery nếu chúng ta gọi là $model->getGroup() (mà tôi tìm thấy là tốt cho các truy vấn mở rộng)

Thật không may nếu tôi làm trả lại đối tượng ActiveQuery, Yii2 hiện một số "kỳ diệu" vào nó và luôn luôn có một SELECT * mà tôi không thể kiểm soát.

+0

Trong Yii AR bạn có thể sử dụng: $ model-> getGroup() để lấy ActiveQuery hoặc $ model-> group để lấy đối tượng BillChangesGroup (Yii2 magic -> group == getGroup() -> một() trong ví dụ của bạn) . Trong giải pháp của bạn, bạn bỏ lỡ điều này. – BaBL86