2

複数のアダプターを使用するプロジェクトがあります。だから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

しかし、それをフィルタリングしようとすると機能しません:

results = $table->fetchRow("id = 1"); // 動作しません。エラー エラー: MyRow 型のアダプターがありません。

誰かアイデアはありますか?ありがとう。

ページネーターも使用するのを忘れていました

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

1 に答える 1

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

この例は、wayZend_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 からメタデータを読み取ることに注意してください。したがって、後でアダプターを変更する場合、テーブルは両方のデータベースで同じように定義する必要があります。

于 2009-10-10T19:27:39.567 に答える