php - una - Cómo cambiar el nombre Zend_Db_Table dentro de un modelo para insertarlo en varias tablas
order by sql server ejemplos (3)
Usando Zend Framework, he creado un Modelo para insertar un registro en una base de datos. Mi pregunta es, después de $this->insert($data)
¿cómo puedo cambiar la tabla activa para poder insertar un registro en otra tabla?
Aquí está mi código hasta ahora:
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();
}
}
Creo que deberías tener otra Model_DbTable
, Model_DbTable_Bar
y llamarla
internamente :
class Model_DbTable_Foo ... {
public function addFooAndBar() {
...
$bar = new Model_DbTable_Bar();
$bar->insert($data2);
}
}
o externamente
class ModelX ... {
public function addFoos() {
$foo = new Model_DbTable_Foo();
$foo->insert($data);
$bar = new Model_DbTable_Bar();
$bar->insert($data2);
}
}
También puedes usar la clase Zend_Db_Table . Algo como esto:
$fooTbl = new Zend_Db_Table(''foo'');
$lastFooID = $fooTbl->insert($data2)
->getAdapter()
->lastInsertId();
Zend_Db_Table
es un Table Data Gateway . Eso
actúa como una puerta de enlace a una tabla de base de datos. Una instancia maneja todas las filas en la tabla.
Esto significa que tienes una clase por mesa. Su Model_DbTable_Foo
representa la tabla Foo en su base de datos y solo esta tabla. No debería hacer inserciones en otras tablas. Para eso usarías otra clase de tabla. La opción más limpia sería agregar otra capa sobre tus TDG que sepa cómo manejar inserciones en varias tablas, por ej.
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'']);
}
}
Sin embargo, es su aplicación y puede decidir no molestarse y simplemente crear una nueva instancia de la otra clase en la clase Foo y hacer la inserción desde allí, por ejemplo
$otherTable = new Model_DbTable_Bar;
$otherTable->insert($data);
Otra opción sería poner la lógica en el controlador, pero no puedo recomendarlo, porque esto no es responsabilidad de un controlador y, en general, los controladores deben mantenerse delgados y los modelos deben estar gordos .
En una nota al margen, cuando está haciendo varias inserciones, es posible que desee utilizar las transacciones para hacer que ambas inserciones funcionen como se esperaba, por ej.
$this->_tables[''foo'']->getAdapter()->beginTransaction();
y luego commit()
o rollback()
dependiendo del resultado de la consulta.
También tenga en cuenta que a partir de ZF1.9, también puede crear instancias de Zend_Db_Table sin tener que definir una subclase concreta primero, por ejemplo
$fooTable = new Zend_Db_Table(''foo'');
Consulte el capítulo sobre Zend_Db_Table en la Guía de referencia de ZF .