3

Zend Framework を使用して、レコードをデータベースに挿入するモデルを作成しました。私の質問は、$this->insert($data)レコードを別のテーブルに挿入できるように、アクティブなテーブルを切り替えるにはどうすればよいですか?

これまでの私のコードは次のとおりです。

class Model_DbTable_Foo extends Zend_Db_Table_Abstract
{
  protected $_name = 'foo';

  public function addFoo($params)
  {
    $data = array(
      'foo' => $params['foo'],
    );
    $this->insert($data);
    $foo_id = $this->getAdapter()->lastInsertId();

    $data2 = array(
      'bar' => $params['bar']
    );
    // I need to change the Db Table name here.
    $this->insert($data2);
    $bar_id = $this->getAdapter()->lastInsertId();
  }
}
4

3 に答える 3

6

Zend_Db_Tableテーブルデータゲートウェイです。それ

データベーステーブルへのゲートウェイとして機能します。1つのインスタンスがテーブル内のすべての行を処理します。

つまり、テーブルごとに1つのクラスがあります。YourModel_DbTable_Fooは、データベース内のFooテーブルを表し、このテーブルのみを表します。他のテーブルへの挿入は行いません。これは、別のテーブルクラスを使用するためのものです。最もクリーンなオプションは、複数のテーブルへの挿入を処理する方法を知っているTDGの上に別のレイヤーを追加することです。

class Model_Gateway_FooBar
{
    protected $_tables;

    public function __construct(Zend_Db_Table_Abstract $foo, 
                                Zend_Db_Table_Abstract $bar)
    {
        $this->_tables['foo'] = $foo;
        $this->_tables['bar'] = $bar;
    }

    public function addFoo($data)
    {
        $this->_tables['foo']->insert($data['foo']);
        // yaddayaddayadda
        $this->_tables['bar']->insert($data['bar']);
    }
}

ただし、これはアプリであり、わざわざしないで、Fooクラスの他のクラスの新しいインスタンスを作成し、そこから挿入を行うことができます。

$otherTable = new Model_DbTable_Bar;
$otherTable->insert($data);

もう1つのオプションは、ロジックをコントローラーに配置することですが、これはコントローラーの責任ではなく、通常はコントローラーを薄くし、モデルを太くする必要があるため、お勧めできません。

ちなみに、複数の挿入を行う場合は、トランザクションを使用して、両方の挿入を期待どおりに機能させることができます。

$this->_tables['foo']->getAdapter()->beginTransaction();

その後、commit()またはrollback()クエリの結果に応じて。

また、ZF1.9以降では、最初に具体的なサブクラスを定義しなくても、Zend_Db_Tableのインスタンスを作成できることに注意してください。

$fooTable = new Zend_Db_Table('foo');

ZFリファレンスガイドのZend_Db_Tableの章を参照してください。

于 2010-03-12T23:49:24.403 に答える
1

私はあなたが別のものを持っているべきだと思いますModel_DbTableModel_DbTable_Barそしてそれをどちらかと呼びます

内部的に

class Model_DbTable_Foo ... {
  public function addFooAndBar() {
    ...
    $bar = new Model_DbTable_Bar();
    $bar->insert($data2);
  }
}

または外部的に

class ModelX ... {
  public function addFoos() {
    $foo = new Model_DbTable_Foo();
    $foo->insert($data);
    $bar = new Model_DbTable_Bar();
    $bar->insert($data2);
  }
}
于 2010-03-12T23:48:34.273 に答える
0

クラスZend_Db_Tableを使用することもできます。このようなもの:

 $fooTbl = new Zend_Db_Table('foo');
 $lastFooID = $fooTbl->insert($data2)
                     ->getAdapter()
                     ->lastInsertId();
于 2012-10-03T09:31:01.817 に答える