anax/database

Anax数据库模块,用于与数据库交互。

v2.3.1 2020-10-23 13:02 UTC

README

Latest Stable Version Join the chat at https://gitter.im/canax/database

Build Status CircleCI

Build Status Scrutinizer Code Quality Code Coverage

Maintainability Codacy Badge

Anax数据库模块作为数据库抽象层(DBA),封装PHP PDO,并额外提供工具和易用性,同时支持使用配置文件,并可以作为服务附加到Anax安装中的$di。

该模块使用MySQL和SQLite进行测试。

anax\database-query-builder中存在独立的数据库查询构建器模块,以及在anax\database-active-record中存在数据库活动记录模块。

目录

安装

您可以使用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;
            }
        ],
    ],
];

设置回调工作如下。

  1. 创建数据库对象。
  2. 读取配置文件。
  3. 应用配置。

作为框架服务访问

您可以将数据库模块作为框架服务访问。

$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