-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 );

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

4

2 回答 2

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 组件)。只需通过 a 运行结果集foreach并将值更改为lastrun您想要的任何值。

我试图找到一个地方来覆盖 Zend Db 组件来做你想做的事,但它会涉及到许多类。

请记住,当使用 DbTable 类时,它们只与一个表交互。您需要为要影响的每个表复制代码,或者您需要扩展某种基类。

您始终可以选择直接使用 Sql 来构建您可以提出的任何查询。

祝你好运!

于 2012-10-10T10:59:47.597 回答
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

}
于 2012-10-11T14:39:34.150 回答