Ошибка адаптера для типа Zend_Db_Table_Row?

У меня есть проект, в котором я использую более одного адаптера. Итак, в моделях 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

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

person Granit    schedule 05.10.2009    source источник
comment
Не могли бы вы опубликовать содержимое класса MyRow? Вам действительно нужна собственная реализация класса Row?   -  person opHASnoNAME    schedule 05.10.2009
comment
Я только что объявил класс. Я думаю, что нет необходимости в реализации. Я просто использую его как строку таблицы.   -  person Granit    schedule 05.10.2009


Ответы (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));
    

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

person Bill Karwin    schedule 10.10.2009