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();
}
}
Zend_Db_Table
is a Table Data Gateway. ItThis 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.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.
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.
and then
commit()
orrollback()
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.
See the chapter on Zend_Db_Table in the ZF Reference Guide.
I think you should have another
Model_DbTable
,Model_DbTable_Bar
and call it eitherinternally:
or externally:
Also you can use the class Zend_Db_Table. Something like this: