我有一个项目,我使用多个适配器。 所以在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);
答案 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读取其元数据,因此如果随后更改适配器,则应在两个数据库中相同地定义表。