2

我有一个使用多个适配器的项目。所以在 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();

当我获取所有它的工作原理:

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

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

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

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

我忘了我也使用分页器

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

1 回答 1

1

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

在表类解析其选项并为表设置适配器调用该init()方法。所以你所做的只是为后续的表构建设置了默认的 Db 适配器,但是如果你在方法中这样做,它对当前表没有影响。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构建方式的简化模型。请注意,该init()方法设置类默认 Db,但这是构造函数已将实例 Db 设置为类默认 Db 之后运行的。所以设置类默认 Db 是没有效果的。

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

  • 对于所有表,使用静态方法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()在表类被实例化后使用该方法。

    $table = new MyModel(); // uses default Db
    $table->setOptions(array('db'=>$otherDb));
    

    但请注意,表在构建过程中会从默认 Db 读取其元数据,因此如果您随后更改适配器,则表在两个数据库中的定义应相同。

于 2009-10-10T19:27:39.567 回答