数据源

    • Mysql
    • Postgres
    • Sqlite
    • Sqlserver

    注解

    你可以在 GitHub 上的 CakePHP 数据源代码库中找到更多社区贡献的数据源。

    当在 app/Config/database.php 中指定数据库连接配置时,CakePHP 会以透明地使用相应的数据库数据源,用于所有的模型操作。所以,即使你并不知道数据源,你也已经一直在使用它们了。

    所有上述数据源继承于一个基类 DboSource,它汇集了大多数关系型数据库通用的一些逻辑。如果你决定编写一个 RDBMS 数据源,你最好从这些中的一个(例如 MySQL 或者SQLite)开始。

    当然,大多数人还是感兴趣于为外部数据来源编写数据源,比如远程 REST API,或者甚至是 LDAP 服务器。所以,这就是我们下面要介绍的。

    数据源能够,而且 应当 实现至少下面中的一个方法:createreadupdate 和/或 delete (方法的真正签名和实现细节在这里不重要,之后会述及)。你不必实现上述方法中不必要的部分 — 如果你需要只读的数据源,就没有理由实现createupdate 和 。

    对所有 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 文件中添加下面的代码来配置数据源:

    1. public $faraway = array(
    2. 'datasource' => 'FarAwaySource',
    3. 'apiKey' => '1234abcd',
    4. );

    然后象这样在模型中使用数据库配置:

    1. class MyModel extends AppModel {
    2. public $useDbConfig = 'faraway';
    3. }

    我们可以用熟悉的模型方法从远程数据源获取数据:

    小技巧

    如果 read 方法的结果不是一个数字下标的数组,使用除 'all' 以外的其它find 类型会导致意想不到的结果。

    同样我们可以保存一条新消息:

    1. 'name' => 'Some Person',
    2. 'message' => 'New Message',
    3. ));
    1. $this->MyModel->id = 42;
    2. $this->MyModel->save(array(
    3. 'message' => 'Updated message',
    4. ));

    以及删除消息:

    你也可以把数据源封装在插件之中。

    你只需把你的数据源文件放在,然后用插件的语法引用它:

    1. public $faraway = array(
    2. 'datasource' => 'MyPlugin.FarAwaySource',
    3. 'apiKey' => 'abcd1234',
    4. );

    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。