没有Zend_Db_Table_Row类型的适配器错误?

时间:2009-10-05 10:15:33

标签: zend-framework zend-db zend-db-table

我有一个项目,我使用多个适配器。 所以在ma模型中我创建了一个抽象模型

abstract My_Config1_Model extends Zend_Db_Table_Abstract 
{

    public function init()
    {
     $db = Zend_Registry::get('dbcon')->getDb(Kiga_Data_Database::MASTER);
     $this->setDefaultAdapter($db);
    }

}

然后我继承了这个抽象类,如:

class MyModel extends My_Config1_Model
{

        protected $_name = 'mytable';

 protected $_primary = 'id';

 protected $_rowClass = 'MyRow';

}


class MyRow extends Zend_Db_Table_Row_Abstract 
{

}

然后在我的控制器中尝试:

$table = new MyModel();

当我获取alll时,它可以工作:

$results = $table->fetchAll(); // works fine

但是当我尝试过滤它时它不起作用:

results = $ table-> fetchRow(“id = 1”); //不起作用我收到错误错误:MyRow类型没有适配器。

有人有什么想法吗? 谢谢。

我忘记了我也使用了paginator

$paginator = Zend_Paginator::factory($results);

1 个答案:

答案 0 :(得分:1)

这不是你应该为这个表设置Db适配器的地方。

在表类解析了其选项并为表设置适配器之后,init()方法称为。所以你所做的就是为后续的表构建设置默认的Db适配器,但如果你在{{1>中执行此操作,它对当前表没有影响方法。

考虑这个简化的例子:

init()

此示例是class MyTable { static $defaultDb; protected $db; static function setDefaultDb($db) { self::$defaultDb = $db; } public function __construct() { $this->db = self::$defaultDb; $this->init(); } public function init() { // Unfortunately, PHP allows you to run static methods // as if they are non-static methods, which is confusing. $this->setDefaultDb($globalDb); } } 构造方式的简化模型。请注意,Zend_Db_Table方法设置类默认Db,但是之后运行构造函数已将实例Db设置为类默认Db。因此,设置类默认Db无效。

有几种方法可以为表设置Db适配器:

  • 对于所有表,使用静态方法init()。使用setDefaultAdapter()的预期方法如下:

    setDefaultAdapter()
  • 作为构造函数参数:

    Zend_Db_Table_Abstract::setDefaultAdapter($db);
    // now all tables will use $db by default
    $table = new MyModel();
    
  • 您可能也可以在实例化表类后使用$table = new MyModel(array('db'=>$db)); 方法。

    setOptions()

    但请注意,该表在构造期间从默认Db读取其元数据,因此如果随后更改适配器,则应在两个数据库中相同地定义表。