Прежде всего, какую версию CakePHP вы используете? Я предполагаю, что речь идет о CakePHP 1.2 +.
Проблема
Я не знаком с SQL Server 2005 (и с любыми другими версиями), но после некоторого исследования, я думаю, проблема в методе DboMssql::listSources()
, который выбирает доступные имена таблиц из INFORMATION_SCHEMA.TABLES
, и поэтому не делает «увидеть» любые доступные виды.
Решение
Измените DboMssql::listSources()
, чтобы выбрать доступные имена таблиц от sys.tables
или, если я не прав насчет sys.tables
, на дополнительно выберите имена из INFORMATION_SCHEMA.VIEWS
.
Таким образом, чтобы не связываться с основными файлами CakePHP, вам необходимо создать собственный источник данных, который расширяет DboMssql и переопределяет метод ::listSources()
. Для этого вам необходимо:
Создать <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;
}
}
}
- Изменить
config/database.php
config: 'driver' => 'custom_mssql'
- Тест
NB: Хуже всего то, что интерфейс DboMssql::listSources()
немного сломан (без дополнительного аргумента $data
(как Datasource::listSources()
объявляет)) и не предоставляет никакой точки расширения, поэтому для кэширования списка источников мы вынуждены вызывать DboSource::listSources()
вместо прерывания parent::listSources()
.