anax / database
Anax数据库模块,用于与数据库交互。
Requires
- php: >=7.2
Requires (Dev)
- phpunit/phpunit: ^8
README
Anax数据库模块作为数据库抽象层(DBA),封装PHP PDO,并额外提供工具和易用性,同时支持使用配置文件,并可以作为服务附加到Anax安装中的$di。
该模块使用MySQL和SQLite进行测试。
在anax\database-query-builder
中存在独立的数据库查询构建器模块,以及在anax\database-active-record
中存在数据库活动记录模块。
目录
- 安装
- 开发
- 类、接口、特性
- 异常
- 配置文件
- DI服务
- 作为框架服务访问
- 创建连接
- 执行SELECT查询
- Fetch与FetchAll
- FetchClass
- FetchInto
- 执行INSERT、UPDATE、DELETE查询
- 最后插入的ID
- 行数、受影响行数
- 在失败时抛出异常
- 依赖
- 许可
安装
您可以使用composer从anax/database
在Packagist上安装该模块。
composer require anax/database
然后您可以复制默认配置文件作为起点。
# In the root of your Anax installation
rsync -av vendor/anax/database/config .
开发
要作为开发者工作,您需要克隆仓库并通过make安装本地环境。然后您可以运行单元测试。
make install
make test
类、接口、特性
以下存在以下类。
异常
所有异常都在命名空间Anax\Database\Exception\
中。以下异常存在,可能会抛出。
配置文件
这是一个示例配置文件。通常与Anax一起使用时存储在config/database.php
中。
/** * Config file for Database. * * Example for MySQL. * "dsn" => "mysql:host=localhost;dbname=test;", * "username" => "test", * "password" => "test", * "driver_options" => [ * \PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'" * ], * * Example for SQLite. * "dsn" => "sqlite::memory:", * "dsn" => "sqlite:$path", * */ return [ "dsn" => null, "username" => null, "password" => null, "driver_options" => null, "fetch_mode" => \PDO::FETCH_OBJ, "table_prefix" => null, "session_key" => "Anax\Database", "emulate_prepares" => false, // True to be very verbose during development "verbose" => null, // True to be verbose on connection failed "debug_connect" => false, ];
您可以在配置文件中使用if语句来为本地开发环境、预发布环境和/或生产环境提供不同的配置。
DI服务
数据库在$di
中作为框架服务创建。以下是通过config/di/db.php
创建数据库服务的示例。
/** * Configuration file for database service. */ return [ // Services to add to the container. "services" => [ "db" => [ "shared" => true, "callback" => function () { $db = new \Anax\Database\Database(); // Load the configuration files $cfg = $this->get("configuration"); $config = $cfg->load("database"); // Set the database configuration $connection = $config["config"] ?? []; $db->setOptions($connection); return $db; } ], ], ];
设置回调工作如下。
- 创建数据库对象。
- 读取配置文件。
- 应用配置。
作为框架服务访问
您可以将数据库模块作为框架服务访问。
$sql = "SELECT * FROM movie;"; # $app style $app->db->connect(); $res = $app->db->executeFetchAll($sql); # $di style $db = $di->get("db"); $db->connect(); $res = $db->executeFetchAll($sql);
创建连接
在使用之前必须连接到数据库。
您可能多次调用$db->connect()
,但是连接只会在第一次调用时建立,因此安全地多次调用该方法。
# $app style $app->db->connect(); # $di style $di->get("db")->connect();
执行SELECT查询
您连接并执行查询,该查询返回一个结果集。
$sql = "SELECT * FROM movie;"; # $app style $app->db->connect(); $res = $app->db->executeFetchAll($sql); # $di style $db = $di->get("db"); $db->connect(); $res = $db->executeFetchAll($sql);
$res
的内容取决于配置键,默认设置为"fetch_mode" => \PDO::FETCH_OBJ,
。
您还可以将executeFetchAll()
分解为两个单独的命令execute()
和fetchAll()
。
$sql = "SELECT * FROM movie;"; # $app style $app->db->connect(); $res = $app->db->execute($sql)->fetchAll(); # $di style $db = $di->get("db"); $db->connect(); $res = $db->execute($sql)->fetchAll();
Fetch与FetchAll
使用fetchAll()
,您可以在数组中检索所有匹配的行。当没有找到匹配的行时,您将获得一个空数组。
使用fetch()
,您将获得结果集中的第一项。当结果集只包含一行时,您可以使用此方法。
$sql = "SELECT * FROM movie WHERE id = 1;"; # $app style $app->db->connect(); $res = $app->db->executeFetch($sql); # $di style $db = $di->get("db"); $db->connect(); $res = $db->executeFetch($sql);
$res
的内容现在是一个类型为\StdClass
的对象,您可以通过名称访问结果集列,例如$res->id
。
FetchClass
您可以将结果集检索到从指定类实例化的对象中。
$sql = "SELECT * FROM movie WHERE id = ?;"; # $app style $app->db->connect(); $res = $app->db->executeFetchClass($sql, [1], "\Anax\SomeClass"); # $di style $db = $di->get("db"); $db->connect(); $res = $db->executeFetchClass($sql, [1], "\Anax\SomeClass");
结果集被插入到新的类 "\Anax\SomeClass"
的一个新对象中。
还有一个 executeFetchAllClass()
方法,它会获取所有匹配行的数组,作为新对象类的实例。
FetchInto
您可以将结果集作为公共属性提取到现有对象中。
$sql = "SELECT * FROM movie WHERE id = ?;"; $obj = new SomeClass(); # $app style $app->db->connect(); $res = $app->db->executeFetchInto($sql, [1], $obj); # $di style $db = $di->get("db"); $db->connect(); $res = $db->executeFetchClass($sql, [1], $obj);
结果集被插入到对象 $obj
中。
执行INSERT、UPDATE、DELETE查询
这些更新数据库的查询使用 $db->execute()
并不返回结果集。
$sql = "UPDATE movie SET title = ? WHERE id = ?;"; # $app style $app->db->connect(); $app->db->execute($sql, ["Some title", 1]); # $di style $db = $di->get("db"); $db->connect(); $db->execute($sql, ["Some title", 1]);
最后插入的ID
当主键是自动生成时,您可以检查最后一次插入的ID。
$sql = "INSERT INTO movie (title) VALUES (?);"; # $app style $app->db->connect(); $app->db->execute($sql, ["Some title"]); $id = $app->lastInsertId(); # $di style $db = $di->get("db"); $db->connect(); $db->execute($sql, ["Some title"]); $id = $db->lastInsertId();
行数、受影响行数
您可以检查最后一次INSERT、UPDATE、DELETE语句影响的行数。
$sql = "DELETE FROM movie;"; # $app style $app->db->connect(); $app->db->execute($sql); $num = $app->rowCount(); # $di style $db = $di->get("db"); $db->connect(); $db->execute($sql); $num = $db->rowCount();
在失败时抛出异常
异常通常在出现错误时立即抛出。
异常是模块特定的 Anax\Database\Exception\Exception
,包含来自PDO层的错误消息的详细信息,无论是从语句还是从PDO对象,具体取决于错误类型。
依赖
没有特别的依赖。该模块通常用于Anax安装中,但也可以在不使用Anax的情况下使用。
许可
本软件遵循MIT许可。有关详细信息,请参阅LICENSE.txt。
.
..: Copyright (c) 2013 - 2018 Mikael Roos, mos@dbwebb.se