4 votes

Modèle CakePHP useTable avec des vues SQL

Je suis en train de convertir notre site Web construit par CakePHP de Pervasive à SQL Server 2005. Après beaucoup de tracas, la configuration que j'ai réussi à mettre en place utilise le pilote ADODB avec 'connect' comme odbc_mssql. Cela permet de se connecter à notre base de données et de construire les requêtes SQL sans problème.

Cependant, voici le problème : un de nos modèles était associé à une vue SQL dans Pervasive. J'ai transféré la vue, mais il semble qu'avec la configuration que j'ai, CakePHP ne puisse pas trouver la vue dans le serveur SQL.

Je n'ai pas trouvé grand-chose après quelques recherches sur Google. Quelqu'un d'autre a-t-il rencontré un tel problème ? Existe-t-il une solution ou un moyen de contourner le problème, ou dois-je m'attendre à une nouvelle conception ?

2voto

ljank Points 75

Tout d'abord, quelle version de CakePHP utilisez-vous ? Je suppose qu'il s'agit de CakePHP 1.2+.

Le problème

Je ne suis pas familier avec SQL Server 2005 (ni avec aucune autre version), mais après quelques recherches, je pense que le problème se situe dans DboMssql::listSources() qui sélectionne les noms de tables disponibles dans INFORMATION_SCHEMA.TABLES et donc il ne "voit" aucune vue disponible.

La solution

Changement DboMssql::listSources() pour sélectionner les noms de tables disponibles dans sys.tables ou, si je me trompe sur sys.tables à en outre, sélectionner les noms à partir de INFORMATION_SCHEMA.VIEWS .

Donc, pour ne pas perturber les fichiers de base de CakePHP, vous devrez créer une source de données personnalisée, qui étend DboMssql et remplace ::listSources() méthode. Pour ce faire, vous devrez :

  1. Créer <path/to/app>/models/datasources/dbo/dbo_custom_mssql.php :

    <?php
    
    App::import('Datasource', 'DboMssql');
    
    class DboCustomMssql
            extends DboMssql
    {
        public
        function listSources()
        {
            $cache = DboSource::listSources();
            if ($cache != null) {
                return $cache;
            }
            $result = $this->fetchAll('SELECT TABLE_NAME FROM SYS.TABLES', false);
            if (!$result || empty($result)) {
                return array();
            } else {
                $tables = array();
                foreach ($result as $table) {
                    $tables[] = $table[0]['TABLE_NAME'];
                }
                DboSource::listSources($tables);
                return $tables;
            }
        }
    }
  2. Changement config/database.php config : 'driver' => 'custom_mssql'

  3. Test

NB : Le pire, c'est que DboMssql::listSources() est un peu défectueuse (sans option d'affichage). $data (comme Datasource::listSources() déclare)) et ne fournit aucun point d'extension, donc, afin d'avoir une mise en cache de la liste des sources, nous sommes obligés d'appeler DboSource::listSources() au lieu de briser parent::listSources() .

0voto

icc97 Points 1602

J'ai des vues SQL Server qui s'affichent avec bonheur. La principale différence avec vous est que j'utilise le pilote mssql plutôt que le pilote odbc_mssql. Vous devriez peut-être essayer de passer à ce pilote et résoudre les problèmes que vous rencontrez dans ce cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X