dongmi3203 2010-03-12 23:03
浏览 36
已采纳

如何更改模型中的Zend_Db_Table名称以插入多个表

Using Zend Framework, I've created a Model to insert a record into a database. My question is, after $this->insert($data) how can I switch the active table so that I can insert a record into another table?

Here's my code so far:

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();
  }
}
  • 写回答

3条回答 默认 最新

  • duanmangxie7131 2010-03-12 23:49
    关注

    Zend_Db_Table is a Table Data Gateway. It

    acts as a Gateway to a database table. One instance handles all the rows in the table.

    This means, you have one class per table. Your Model_DbTable_Foo represents the Foo table in your database and only this table. It should not do inserts on other tables. That's what you would use another table class for. The cleanest option would be to add another layer on top of your TDGs that knows how to handle inserts to multiple tables, e.g.

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

    However, it's your app and you can decide not to bother and simply create a new instance of the other class in the Foo class and do the insert from there, e.g.

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

    Another option would be to put the logic into the controller, but I cannot recommend it, because this is not the responsibility of a controller and generally controllers should be kept thin and models should be fat.

    On a sidenote, when you're doing multiple inserts, you might want to use transactions to make both inserts work as expected, e.g.

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

    and then commit() or rollback() depending on the query outcome.

    Also note that as of ZF1.9, you can also create instances of Zend_Db_Table without having to define a concrete subclass first, e.g.

    $fooTable = new Zend_Db_Table('foo');
    

    See the chapter on Zend_Db_Table in the ZF Reference Guide.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 抖音咸鱼付款链接转码支付宝
  • ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 求螺旋焊缝的图像处理
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?
  • ¥15 网络通信安全解决方案
  • ¥50 yalmip+Gurobi
  • ¥20 win10修改放大文本以及缩放与布局后蓝屏无法正常进入桌面
  • ¥15 itunes恢复数据最后一步发生错误
  • ¥15 关于#windows#的问题:2024年5月15日的win11更新后资源管理器没有地址栏了顶部的地址栏和文件搜索都消失了