2009-10-05 4 views
2

J'ai un projet dans lequel j'utilise plus d'un adaptateur. Alors Dans les modèles de ma i créé un modèle abstraitPas d'adaptateur pour l'erreur de type 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); 
    } 

} 

et je hériteront de cette classe abstaract comme:

class MyModel extends My_Config1_Model 
{ 

     protected $_name = 'mytable'; 

protected $_primary = 'id'; 

protected $_rowClass = 'MyRow'; 

} 


class MyRow extends Zend_Db_Table_Row_Abstract 
{ 

} 

et dans mon contrôleur je tente:

$table = new MyModel(); 

quand je aller chercher alll ça marche:

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

mais lorsque j'essaie de le filtrer, cela ne fonctionne pas:

results = $ table-> fetchRow ("id = 1"); // Ne marche pas. Je reçois l'erreur Erreur: Aucun adaptateur pour le type MyRow.

Quelqu'un a-t-il une idée? Merci.

J'oublié que je l'utilise aussi paginator

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

Pouvez-vous s'il vous plaît poster le contenu de la classe MyRow? Avez-vous vraiment besoin d'une implémentation de la classe Row? – opHASnoNAME

+0

Je viens de déclarer la classe. Je suppose qu'il n'y a pas besoin de mise en œuvre. Je l'utilise juste comme rangée de la table. – Granit

Répondre

1

Ce n'est pas l'endroit où vous devez définir l'adaptateur Db pour cette table.

La méthode init() est appelée après la classe de table a analysé ses options et configuré l'adaptateur pour la table. Donc tout ce que vous avez accompli est de définir l'adaptateur Db par défaut pour suivant la construction de la table, mais cela n'a aucun effet sur la table actuelle si vous le faites dans la méthode .

Considérons cet exemple simplifié:

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

Cet exemple est un modèle simplifié de la façon dont Zend_Db_Table constructions. Notez que la méthode init() définit la valeur par défaut de la classe Db, mais qu'elle est exécutée après le constructeur a déjà défini l'instance Db comme étant le Db par défaut de la classe. La définition de la classe Db par défaut n'a donc aucun effet.

Il y a plusieurs façons dont vous pouvez configurer l'adaptateur Db pour une table:

  • Pour toutes les tables, en utilisant la méthode statique setDefaultAdapter(). La façon dont l'intention d'utiliser setDefaultAdapter() est la suivante:

    Zend_Db_Table_Abstract::setDefaultAdapter($db); 
    // now all tables will use $db by default 
    $table = new MyModel(); 
    
  • Comme argument du constructeur:

    $table = new MyModel(array('db'=>$db)); 
    
  • Vous pourriez également être en mesure d'utiliser la méthode setOptions() après la classe de table a été instancié.

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

    Mais sachez que la table lit les métadonnées de la valeur par défaut Db lors de la construction, donc si vous changez l'adaptateur par la suite, la table doit être définie de manière identique dans les deux bases de données.

Questions connexes