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 :
-
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;
}
}
}
-
Changement config/database.php
config : 'driver' => 'custom_mssql'
-
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()
.