数据库抽象层(Database Abstraction Layer)
Phalcon\Db是Phalcon\Mvc\Model底层组件,由它驱动框架中的模型层。它完全由C语言编写,是一个独立的数据库高级抽象层。
与传统模型相比,该组件允许更底层的数据库操作。
数据库适配器(Database Adapters)
该组件使用适配器来封装特定的数据库操作。Phalcon使用PDO连接数据库,支持下列数据库引擎:
类
说明
Phalcon\Db\Adapter\Pdo\Mysql
世界上最流行的关系型数据库系统(RDBMS),作为服务器运行,支持多用户、多数据库访问
Phalcon\Db\Adapter\Pdo\Postgresql
Postgresql是一个强大的开源关系数据库系统,超过15年的发展和通过验证的架构,为其赢得了正确、可靠、数据完整的良好声誉
Phalcon\Db\Adapter\Pdo\Sqlite
SQLite是一个实现自包含、无服务、零配置的事务型数据库
工厂类(Factory)
使用适配器选项加载PDO:
use Phalcon\Db\Adapter\Pdo\Factory;
$options = [
'host' => 'localhost',
'dbname' => 'blog',
'port' => 3306,
'username' => 'sigma',
'password' => 'secret',
'adapter' => 'mysql',
];
$db = Factory::load($options);
自定义适配器(Implementing your own adapters)
创建自定义数据库适配器或扩展现有适配器,必须实现Phalcon\Db\AdapterInterface接口。
数据库语言(Database Dialects)
phalcon语言封装了每个数据库的具体操作,为适配器提供通用方法和SQL生成器。
类
说明
Phalcon\Db\Dialect\Mysql
MySQL特定语言
Phalcon\Db\Dialect\Postgresql
Postgresql特定语言
Phalcon\Db\Dialect\Sqlite
SQLite特定语言
自定义语言(Implementing your own dialects)
创建自定义数据库语言或扩展现有语言,必须实现Phalcon\Db\DialectInterface接口。
连接数据库(Connection to Databases)
建立数据库连接,必须实例化适配器类,它只接收一个包含连接参数的数组。下面例子展示了如何传递必选参数和可选参数来建立数据库连接:
// 必选参数
$config = [
'host' => '127.0.0.1',
'username' => 'mike',
'password' => 'sigma',
'dbname' => 'test_db',
];
// 可选参数
$config['persistent'] = false;
// 建立连接
$connection = new \Phalcon\Db\Adapter\Pdo\Mysql($config);
// 必选参数
$config = [
'host' => 'localhost',
'username' => 'postgres',
'password' => 'secret1',
'dbname' => 'template',
];
// 可选参数
$config['schema'] = 'public';
// 建立连接
$connection = new \Phalcon\Db\Adapter\Pdo\Postgresql($config);
设置额外的PDO选项(Setting up additional PDO options)
在建立连接时,传递options参数设置PDO:
// 使用PDO选项建立连接
$connection = new \Phalcon\Db\Adapter\Pdo\Mysql(
[
'host' => 'localhost',
'username' => 'root',
'password' => 'sigma',
'dbname' => 'test_db',
'options' => [
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8',
PDO::ATTR_CASE => PDO::CASE_LOWER,
],
]
);
使用工厂类连接数据库(Connecting using Factory)
使用一个简单的ini文件来配置 / 连接数据库。
[database]
host = TEST_DB_MYSQL_HOST
username = TEST_DB_MYSQL_USER
password = TEST_DB_MYSQL_PASSWD
dbname = TEST_DB_MYSQL_NAME
port = TEST_DB_MYSQL_PORT
charset = TEST_DB_MYSQL_CHARSET
adapter = mysql
use Phalcon\Config\Adapter\Ini;
use Phalcon\Db\Adapter\Pdo\Factory;
use Phalcon\Di;
$di = new Di();
$config = new Ini('config.ini');
$di->set('config', $config);
$di->set(
'db',
function () {
return Factory::load($this->config->database);
}
);
上述代码返回数据库连接实例,这样做的好处是可以在不修改应用代码的情况下改变数据库连接甚至是数据库适配器。
查询记录(Finding Rows)
Phalcon\Db提供了多种查询方法。这种情况下,SQL必须遵循数据库引擎的特定语法:
$sql = "SELECT id, name FROM robots ORDER BY name";
// 发送SQL语句到数据库
$result = $connection->query($sql);
// 打印robot的name字段
while ($robot = $result->fetch()) {
echo $robot['name'];
}
// 获取结果集数组
$robots = $connection->fetchAll($sql);
foreach ($robots as $robot) {
echo $robot['name'];
}
// 获取结果集中的第一条记录
$robot = $connection->fetchOne($sql);
默认情况下,调用这些方法会返回一个数组(关联+索引)。可以调用Phalcon\Db\Result::setFetchMode()方法改变这种行为,该方法接收一个常量值,定义返回结果集的类型:
常量
说明
Phalcon\Db::FETCH_NUM
返回索引数组
Phalcon\Db::FETCH_ASSOC
返回关联数组
Phalcon\Db::FETCH_BOTH
返回数组(索引+关联)
Phalcon\Db::FETCH_OBJ
返回对象
$sql = "SELECT id, name FROM robots ORDER BY name";
$result = $connection->query($sql);
$result->setFetchMode(Phalcon\Db::FETCH_NUM);
while ($robot = $result->fetch()) {
echo $robot[0];
}
Phalcon\Db::query()方法返回一个Phalcon\Db\Result\Pdo实例。该对象封装了与返回结果集相关的所有功能,如遍历、查找特定行、统计总行数等。