Sql server 带有SQL视图的CakePHP模型useTable

Sql server 带有SQL视图的CakePHP模型useTable,sql-server,sql-server-2005,cakephp,Sql Server,Sql Server 2005,Cakephp,我正在将我们的CakePHP构建的网站从普及转换为SQLServer2005。在经历了很多麻烦之后,我开始使用ADODB驱动程序,并将“connect”作为odbc\u mssql。这将连接到我们的数据库并构建SQL查询 然而,这里有一个问题:我们的一个模型与普适数据库中的SQL视图相关联。我在视图上进行了移植,但使用我的设置,CakePHP似乎无法在SQL Server中找到该视图 在一些谷歌搜索后找不到太多——还有其他人遇到过这样的问题吗?是否有解决方案/解决方法,或者在我的未来是否有一些重

我正在将我们的CakePHP构建的网站从普及转换为SQLServer2005。在经历了很多麻烦之后,我开始使用ADODB驱动程序,并将“connect”作为odbc\u mssql。这将连接到我们的数据库并构建SQL查询

然而,这里有一个问题:我们的一个模型与普适数据库中的SQL视图相关联。我在视图上进行了移植,但使用我的设置,CakePHP似乎无法在SQL Server中找到该视图


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

首先,您使用的是哪个版本的CakePHP?我假设它是关于CakePHP1.2+的

问题 我不熟悉SQL Server 2005(或任何其他版本),但经过一些调查,我认为问题出在
DboMssql::listSources()
方法中,该方法从
INFORMATION\u SCHEMA.TABLES
中选择可用的表名,因此它不会“看到”任何可用的视图

解决方案 更改
DboMssql::listSources()
以从
sys.tables
中选择可用的表名,或者,如果我对
sys.tables
的理解有误,则从
信息\u SCHEMA.VIEWS
中另外选择名称

因此,为了避免弄乱CakePHP核心文件,您必须创建自定义数据源,它扩展DboMssql并覆盖
::listSources()
方法。为此,您必须:

  • 创建
    /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;
            }
        }
    }
    

    我可以愉快地显示SQL Server视图。我与您的主要区别在于我使用的是mssql驱动程序,而不是odbc_mssql驱动程序。也许你应该试着换一种方式,先弄清楚你有什么问题

    我以前在MySQL中构建过针对视图的CakePHP模型,它按照预期工作(不过,您显然无法写入视图,只能从中读取数据)。也许SQL Server以不同于其他RDBMS的方式呈现视图?