sql-server – CakePHP模型useTable with SQL Views

我正在将我们的Cake
PHP构建的网站从Pervasive转换为SQL Server 2005.经过很多麻烦我已经开始工作的设置是使用带有’connect’的ADODB驱动程序作为odbc_mssql.这连接到我们的数据库并构建SQL查询就好了.

但是,这就是问题:我们的一个模型与Pervasive中的SQL视图相关联.我移植了视图,但是看起来我使用的设置是CakePHP无法在SQL Server中找到View.

一些谷歌搜索后找不到多少 – 有没有其他人遇到这样的问题?是否有解决方案/解决方法,或者我的未来是否有一些重新设计?

最佳答案 首先,您使用的是哪个版本的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’
>测试

注意:最糟糕的是DboMssql :: listSources()接口有点坏了(没有可选的$data参数(比如Datasource :: listSources()声明))并且没有提供任何扩展点,所以,按顺序要有源列表缓存,我们不得不调用DboSource :: listSources()而不是破坏parent :: listSources().

点赞