2009-10-05 2 views
2

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

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); 
    } 

} 

, а затем я наследовать этот abstaract класс как:

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(); 

, когда я fetch alll он работает:

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

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

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

У кого-нибудь есть идея? Спасибо.

Я забыл, что я также использовать Paginator

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

Можете ли вы разместить содержание класса MyRow? Вам действительно нужна собственная реализация класса Row? – opHASnoNAME

+0

Я только что объявил класс. Я думаю, что нет необходимости в реализации. Я просто использую его как строку таблицы. – Granit

ответ

1

Это не место, вы должны установить адаптер 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)); 
    

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

 Смежные вопросы

  • Нет связанных вопросов^_^