我正在将我们的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().