Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Je cherche à utiliser les outils Zend pour me connecter à ma base de donnée Oracle, et ma question est simple, comment définir le "schema" de la table?
Actuellement je procède de la façon suivante :
dans config/autoload/global.php :
[lang=php] return array( 'MaBase' => array( 'driver' => 'Oci8', 'hostname' => 'mabase:89500/INSTANCE', 'character_set' => 'AL32UTF8', 'username' => 'xxx', 'password' => 'xxx', ), );
dans config/application.config.php :
[lang=php] ... 'service_manager' => array( 'use_defaults' => true, 'factories' => array('mon-adapter' => function($sm) { $config = $sm->get('config'); $config = $config['MaBase']; $dbAdapter = new DbAdapter($config); return $dbAdapter; }, ), ), ...
dans module/Monmodule/Module.php :
[lang=php] ... public function getServiceConfig() { return array( 'factories' => array( 'Monmodule\Model\MaTable' => function($sm) { $tableGateway = $sm->get('MaTableGateway'); $table = new TestTable($tableGateway); return $table; }, 'MaTableGateway' => function ($sm) { $dbAdapter = $sm->get('mon-adapter'); $resultSetPrototype = new ResultSet(); $resultSetPrototype->setArrayObjectPrototype(new Test()); return new TableGateway('TABLE', $dbAdapter, null, $resultSetPrototype); }, ), ); } ...
Cela fonctionne si ma table est dans le schéma Oracle par défaut de mon username, en revanche si je veux accèder à un autre schema je n'y parvient pas. J'ai tenté :
[lang=php]return new TableGateway('SCHEMA.TABLE', $dbAdapter, null, $resultSetPrototype);
Mais il ne parvient pas à trouver la table.
Il y a t'il une façon particulière de gérer les schéma ?
Gaël
Dernière modification par gael.lm (22-06-2014 13:17:54)
Hors ligne
Bonjour,
J'ai trouvé la solution, la voici pour les prochains à butter sur le sujet : dans le code Zend, en allant voir la class TableGateway :
[lang=php] class TableGateway extends AbstractTableGateway { /** * Constructor * * @param string $table * @param AdapterInterface $adapter * @param Feature\AbstractFeature|Feature\FeatureSet|Feature\AbstractFeature[] $features * @param ResultSetInterface $resultSetPrototype * @param Sql $sql * @throws Exception\InvalidArgumentException */ public function __construct($table, AdapterInterface $adapter, $features = null, ResultSetInterface $resultSetPrototype = null, Sql $sql = null) { // table if (!(is_string($table) || $table instanceof TableIdentifier)) { throw new Exception\InvalidArgumentException('Table name must be a string or an instance of Zend\Db\Sql\TableIdentifier'); } $this->table = $table; ...
Le paramètre $table peut être un string mais aussi une instance de la class TableIdentifier, c'est cette même class qui gère la notion de shéma. Petite remarque au passage, il manque cette notion dans le commentaire du constructeur, il ne montre que le type String.
Mon code devient donc :
dans module/Monmodule/Module.php :
[lang=php] ... use Zend\Db\Sql\TableIdentifier; ... public function getServiceConfig() { return array( 'factories' => array( 'Monmodule\Model\MaTable' => function($sm) { $tableGateway = $sm->get('MaTableGateway'); $table = new TestTable($tableGateway); return $table; }, 'MaTableGateway' => function ($sm) { $dbAdapter = $sm->get('mon-adapter'); $resultSetPrototype = new ResultSet(); $resultSetPrototype->setArrayObjectPrototype(new Test()); $table = new TableIdentifier('TABLE','SCHEMA'); return new TableGateway($table, $dbAdapter, null, $resultSetPrototype); }, ), ); } ...
Hors ligne
Bonjour,
Attention l'utilisation de "join" avec TableIdentifier génère une erreur :
$select = new Select();
$table = new TableIdentifier('TABLE1','SCHEMA1');
$table2 = new TableIdentifier('TABLE2','SCHEMA2');
$select->from($table);
$select->join($table2, "TABLE2.ID = TABLE1.TABLE2ID", array('FIELD_TABLE2'), 'left');
$resultSet = $this->tableGateway->selectWith($select);
ERREUR : "Object of class Zend\Db\Sql\TableIdentifier could not be converted to string ..."
j'ai logué un defect: https://github.com/zendframework/zf2/issues/6411
La solution que j'utilise actuellement: mettre en commentaire la méthode processJoins() de la class Zend\Db\Sql\Platform\Oracle\SelectDecorator.php afin d'utiliser la méthode héritée de la class Select.
Gaël
Hors ligne
Pages: 1