2012-10-10 51 views
-2

是否可以覆蓋來自Model-> fetchAll()的值,以便它在全局範圍內工作。我曾嘗試在模型來覆蓋這一點,但不工作:覆蓋模型中的返回值

class Application_Model_DbTable_OdbcPush extends Zend_Db_Table_Abstract 
{ 

    public function __get(string $col) 
    { 
     $res = parent::__get($col); 
     if ($col == "lastrun") { 
      $res = ($res == "1912-12-12 00:00:00+07" ? NULL : $res); 
     } 
     return $res; 
    } 
    //... 
} 

在控制器:

$odbcModel = new Application_Model_DbTable_OdbcPush(); 
    $rs = $odbcModel->fetchAll($select); 

我要覆蓋從使用fetchall(返回值),發現()等在山坳名是「拉斯特魯恩」;

+0

我不明白的問題。你想達到什麼目的? – RockyFord

+0

我想覆蓋從fetchAll(),find()等返回的值,當col名稱是「lastrun」; – Superbiji

回答

0

找到了答案,社區我在這裏分享:d http://framework.zend.com/manual/1.12/en/zend.db.table.row.html

所以我們要重載一個Zend_Db_Table_Row並將其分配給模擬/ DBTABLE:

class Application_Model_DbTable_Row_OdbcPush extends Zend_Db_Table_Row_Abstract 
{ 

    // do some override here 

} 


class Application_Model_DbTable_OdbcPush extends Zend_Db_Table_Abstract 
{ 

    protected $_name = 'odbcpush'; 
    protected $_primary = 'id'; 
    private  $_global = null; 
    protected $_rowClass = "Application_Model_DbTable_Row_OdbcPush"; 

    // etc 

} 
1

你這樣做的方式是行不通的。 __get用於從protectedprivate屬性獲取數據,並且通常與getter一起使用。

例如,如果你在你的Application_Model_DbTable_OdbcPush類實現__get()你可以這樣做:

$model = new Application_Model_DbTable_OdbcPush(); 
//echo out the _primary property (primary key of the table) 
echo $model->primary; 

,並期望它的工作。因爲_primary作爲Zend_Db_Table_Abstract中的一個屬性存在。

要做你想做的事情,你需要在返回結果集之後做它(除非你想重寫整個Zend Db組件)。只需運行結果集foreach並將lastrun的值更改爲任何您想要的值。

我試圖找到一個地方重寫Zend Db組件來做你想做的事,但它會涉及到很多類。

請記住,使用DbTable類時,它們只與一個表交互。您需要複製每個要生效的表的代碼,或者需要擴展某種基類。

您始終可以選擇使用直Sql來構建您可以提出的任何查詢。

祝你好運!

+0

使用直接SQL可以完成,也循環然後更改值(foreach),但有很多代碼我不得不改變:(我希望有一個適當的方式來做到這一點是一個模型 – Superbiji

+0

__get是在公共模型:p – Superbiji

+0

@Superbiji我明白,但這不是神奇的方法。http://www.php.net/manual/en/language.oop5.overloading.php#object.get – RockyFord