CakePHP模型使用表与SQL视图

时间:2010-02-25 14:59:33

标签: sql-server sql-server-2005 cakephp

我正在将CakePHP构建的网站从Pervasive转换为SQL Server 2005.在经历了很多麻烦之后,我已经开始使用ADODB驱动程序和'connect'作为odbc_mssql。这连接到我们的数据库并构建SQL查询就好了。

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

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

2 个答案:

答案 0 :(得分:2)

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

问题

我不熟悉SQL Server 2005(也没有任何其他版本),但经过一些调查后,我认为问题出在DboMssql::listSources()方法中,该方法从INFORMATION_SCHEMA.TABLES中选择可用的表名称,因此它没有“看到”任何可用的观点。

解决方案

更改DboMssql::listSources()以从sys.tables中选择可用的表名称,如果我对sys.tables有误,则选择另外从{{1}中选择名称}。

所以,不要乱用CakePHP核心文件,你必须创建自定义数据源,扩展DboMssql并覆盖INFORMATION_SCHEMA.VIEWS方法。为此,您必须:

  1. 创建::listSources()

    <path/to/app>/models/datasources/dbo/dbo_custom_mssql.php
  2. 更改<?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:config/database.php
  3. 测试
  4. NB:最糟糕的是'driver' => 'custom_mssql'接口有点破碎(没有可选的DboMssql::listSources()参数(如$data声明))并且没有提供任何扩展点,因此,为了进行源列表缓存,我们不得不拨打Datasource::listSources()而不是损坏DboSource::listSources()

答案 1 :(得分:0)

我正在愉快地显示SQL Server视图。我对你的主要区别是我使用的是mssql驱动程序而不是odbc_mssql驱动程序。也许你应该尝试切换到那个并找出你在那里遇到的任何问题。