Нет адаптера для ошибки типа Zend_Db_Table_Row? - PullRequest
2 голосов
/ 05 октября 2009

У меня есть проект, в котором я использую более одного адаптера. Так в моделях ма я создал абстрактную модель

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

но когда я пытаюсь его отфильтровать, он не работает:

results = $ table-> fetchRow ("id = 1"); // Не работает. Я получаю сообщение об ошибке Ошибка: нет адаптера для типа MyRow.

У кого-нибудь есть идея? Благодарю.

Я забыл, я использую также paginator

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

1 Ответ

1 голос
/ 10 октября 2009

Это не то место, где вы должны установить адаптер Db для этой таблицы.

Метод init() называется после . Класс таблицы проанализировал свои параметры и настроил адаптер для таблицы. Итак, все, что вам удалось сделать, - это установить адаптер Db по умолчанию для последующего построения таблицы , но это не повлияет на таблицу current , если вы сделаете это в методе 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));
    

    Но имейте в виду, что таблица считывает свои метаданные из базы данных по умолчанию во время построения, поэтому, если впоследствии вы меняете адаптер, таблица должна быть одинаково определена в обеих базах данных.

...