Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 19-06-2014 16:32:44

gael.lm
Nouveau membre
Date d'inscription: 29-11-2013
Messages: 6

[Résolu] Comment gérer les schémas avec TableGateway sur Oracle

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 :

Code:

[lang=php]
return array(
    'MaBase' => array(
        'driver' => 'Oci8',
        'hostname' => 'mabase:89500/INSTANCE',
        'character_set' => 'AL32UTF8',
        'username' => 'xxx',
        'password' => 'xxx',
        ),
);

dans config/application.config.php :

Code:

[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 :

Code:

[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é :

Code:

[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

 

#2 20-06-2014 09:49:10

gael.lm
Nouveau membre
Date d'inscription: 29-11-2013
Messages: 6

Re: [Résolu] Comment gérer les schémas avec TableGateway sur Oracle

Bonjour,

    J'ai trouvé la solution, la voici pour les prochains à butter sur le sujet wink : dans le code Zend, en allant voir la class TableGateway :
   

Code:

[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 :

Code:

[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

 

#3 25-06-2014 09:32:43

gael.lm
Nouveau membre
Date d'inscription: 29-11-2013
Messages: 6

Re: [Résolu] Comment gérer les schémas avec TableGateway sur Oracle

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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages