Модель CakePHP useTable с представлениями SQL - PullRequest
4 голосов
/ 25 февраля 2010

Я нахожусь в процессе преобразования нашего веб-сайта, созданного в CakePHP, из Pervasive в SQL Server 2005. После многих хлопот, с которыми я начал работать, я использую драйвер ADODB с 'connect' как odbc_mssql. Это подключается к нашей базе данных и создает запросы SQL просто отлично.

Однако вот в чем проблема: одна из наших моделей была связана с представлением SQL в Pervasive. Я портировал представление, но он использует настройки, которые у меня есть, что CakePHP не может найти представление в SQL Server.

Не удалось найти много после некоторых поисков в Google - кто-нибудь еще сталкивался с такой проблемой? Есть ли решение / обходной путь, или есть какое-то изменение в моем будущем?

Ответы [ 2 ]

2 голосов
/ 11 июня 2010

Прежде всего, какую версию CakePHP вы используете? Я предполагаю, что речь идет о CakePHP 1.2 +.

Проблема

Я не знаком с SQL Server 2005 (и с любыми другими версиями), но после некоторого исследования, я думаю, проблема в методе DboMssql::listSources(), который выбирает доступные имена таблиц из INFORMATION_SCHEMA.TABLES, и поэтому не делает «увидеть» любые доступные виды.

Решение

Измените DboMssql::listSources(), чтобы выбрать доступные имена таблиц от sys.tables или, если я не прав насчет sys.tables, на дополнительно выберите имена из INFORMATION_SCHEMA.VIEWS.

Таким образом, чтобы не связываться с основными файлами CakePHP, вам необходимо создать собственный источник данных, который расширяет DboMssql и переопределяет метод ::listSources(). Для этого вам необходимо:

  1. Создать <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. Изменить config/database.php config: 'driver' => 'custom_mssql'
  3. Тест

NB: Хуже всего то, что интерфейс DboMssql::listSources() немного сломан (без дополнительного аргумента $data (как Datasource::listSources() объявляет)) и не предоставляет никакой точки расширения, поэтому для кэширования списка источников мы вынуждены вызывать DboSource::listSources() вместо прерывания parent::listSources().

0 голосов
/ 21 сентября 2012

У меня успешно отображаются представления SQL Server. Основное отличие, которое я имею для вас, заключается в том, что я использую драйвер mssql, а не драйвер odbc_mssql. Возможно, вам следует попытаться переключиться на это и выяснить, какие проблемы у вас есть в первую очередь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...