覆盖Model中的返回值

时间:2012-10-10 04:00:45

标签: php zend-framework

是否可以覆盖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 );

当col名称为“lastrun”时,我想覆盖从fetchAll(),find()等返回的值;

2 个答案:

答案 0 :(得分:1)

你的方式不会起作用。 __get用于从protectedprivate属性获取数据,通常与getter一起使用。

例如,如果您在__get()课程中实施Application_Model_DbTable_OdbcPush,则可以执行以下操作:

$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来构建您可以提出的任何查询。

祝你好运!

答案 1 :(得分:0)

找到答案,我在这里分享的社区:D http://framework.zend.com/manual/1.12/en/zend.db.table.row.html

所以我们必须重载Zend_Db_Table_Row并将其分配给model / 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

}