数据源
- Mysql
- Postgres
- Sqlite
- Sqlserver
注解
你可以在 GitHub 上的 CakePHP 数据源代码库中找到更多社区贡献的数据源。
当在 app/Config/database.php
中指定数据库连接配置时,CakePHP 会以透明地使用相应的数据库数据源,用于所有的模型操作。所以,即使你并不知道数据源,你也已经一直在使用它们了。
所有上述数据源继承于一个基类 DboSource
,它汇集了大多数关系型数据库通用的一些逻辑。如果你决定编写一个 RDBMS 数据源,你最好从这些中的一个(例如 MySQL 或者SQLite)开始。
当然,大多数人还是感兴趣于为外部数据来源编写数据源,比如远程 REST API,或者甚至是 LDAP 服务器。所以,这就是我们下面要介绍的。
数据源能够,而且 应当 实现至少下面中的一个方法:create
、read
、update
和/或 delete
(方法的真正签名和实现细节在这里不重要,之后会述及)。你不必实现上述方法中不必要的部分 — 如果你需要只读的数据源,就没有理由实现create
、update
和 。
对所有 CRUD 方法都要实现的方法:
describe($model)
listSources($data = null)
calculate($model, $func, $params)
你想要编写自己的数据源的一个常见原因是当你要使用通常的Model::find()/save()/delete()
方法来访问第三方 API。让我们来编写一个数据源,来访问一个假想的基于 JSON 的 远程 API。我们会把它叫做 FarAwaySource
,并把它放在 app/Model/Datasource/FarAwaySource.php
里:
接下去,我们就可以在 app/Config/database.php
文件中添加下面的代码来配置数据源:
- public $faraway = array(
- 'datasource' => 'FarAwaySource',
- 'apiKey' => '1234abcd',
- );
然后象这样在模型中使用数据库配置:
- class MyModel extends AppModel {
- public $useDbConfig = 'faraway';
- }
我们可以用熟悉的模型方法从远程数据源获取数据:
小技巧
如果 read
方法的结果不是一个数字下标的数组,使用除 'all'
以外的其它find 类型会导致意想不到的结果。
同样我们可以保存一条新消息:
- 'name' => 'Some Person',
- 'message' => 'New Message',
- ));
- $this->MyModel->id = 42;
- $this->MyModel->save(array(
- 'message' => 'Updated message',
- ));
以及删除消息:
你也可以把数据源封装在插件之中。
你只需把你的数据源文件放在,然后用插件的语法引用它:
- public $faraway = array(
- 'datasource' => 'MyPlugin.FarAwaySource',
- 'apiKey' => 'abcd1234',
- );
Sqlserver 数据源依赖于微软的名为 pdo_sqlsrv 的 PHP 扩展。该扩展未包含在 PHP 的基本安装中,必须单独安装。
而且必须安装 SQL Server Native Client,该扩展才能工作。由于 Native Client 只适用于 Windows,你无法在 Linux、Mac OS X 或者 FreeBSD 上安装。
所以,如果 Sqlserver 数据源报如下错误:
请首先检查是否正确安装了 SQL Server PHP 扩展 pdo_sqlsrv 和 SQL Server NativeClient。