PDO 包装器。扩展 PDO 和 PDOStatement,增加有用的方法。

v1.1.0 2014-06-01 08:07 UTC

This package is not auto-updated.

Last update: 2024-09-26 05:14:36 UTC


README

PDO 包装器扩展 PDO 和 PDOStatement 类,并添加了一些有用的方法,如插入、更新、删除等。此外,还有一个非常有用的 SQL 查询构建器。

API

由于库扩展了 PDO 驱动,因此您可以使用所有原生 PDO 方法和新增的

DB - 数据库类

  • insert - 将对象或数组作为行插入到数据库表中(可选:使用预处理语句)
  • update - 更新数据库表中的现有行(可选:使用预处理语句)
  • replace - 插入或替换(使用 REPLACE 表... 语法)
  • save - 将数据保存到表中(方法确定是否使用插入或更新)
  • delete - 从数据库表中删除行
  • count - SELECT COUNT(*) 语句的快捷方式
  • select - 查询构建对象
  • createQuery - 创建新的查询构建器
  • getColumnsFromTable - 返回表的全部列作为数组

语句

  • fetchInto - 将行提取到对象中(可选:仅从特定表中提取)
  • fetchIntoFromLastRow - 从最后一行中提取另一个对象(基于表名)
  • fetchCollection - 提取对象集合(自定义定义的对象或 stdClass)
  • getColumnValue - 从特定列获取值

查询 - 构建 SQL 查询对象

  • select - SELECT 语句
  • from - FROM 语句
  • where - 添加新的 WHERE 语句。多个 WHERE 将通过 AND 连接
  • whereIn - 添加 WHERE IN (...) 语句
  • whereNotIn - 添加 WHERE NOT IN (...) 语句
  • having - HAVING 语句
  • join - 连接表语法
  • groupBy - GROUP BY 语句
  • orderBy - ORDER BY 语句
  • limit - LIMIT 语句
  • getQuery - 构建并返回查询字符串
  • execute - 执行查询

有关如何使用数据库查询构建器的更多信息,请参阅 如何使用数据库查询构建器

用法示例

创建数据库实例

$db = new database\DB("mysql:host=localhost;dbname=YOUR_DB_NAME", "YOUR_DB_USERNAME", "YOUR_DB_PASSWORD");

Select

执行查询并获取 User 对象

class User {}

$user_id = 1;
$sql = "SELECT * FROM users WHERE user_id = ? AND is_active = ?";
$user = $db->executeQuery($sql, array($user_id, 1))
	->fetchInto(new User); // or ->fetchObject("User") as in standard PDO driver

如果您需要 User 对象的集合,您可以使用 fetchCollection 方法

$users = $db->executeQuery($sql, array($user_id, 1))
	->fetchCollection(new User); // or ->fetchCollection("User");

更复杂,使用查询构建器。您可以构建 'native' 对象结构。例如,您可以获取 Post 对象的集合,每个 Post 对象可能都有一个属性 $author,它是 User 对象的一个实例

class User
{
    /**
     * Get user's first and last name
     *
     * @return string
     */
    function getName() {
        return $this->first_name . " ". $this->last_name;
    }
}

class Post
{
	/**
	 * @var User
	 */
	public $author;
}

// Library need FETCH_TABLE_NAMES option for mapping class names and table names
$db->setFetchTableNames(1);

$sql = $db->select("p.*, u.*")
	->from("posts p")
	->join("INNER JOIN users u USING(user_id)")
	->where("u.user_id = ?", $user_id)
	->orderBy("p.title");
	
$stmt = $sql->execute();

/* @var Post[] $post_collection  */
$post_collection = array();

// Fetching data into Post object from posts table (p is alias)
while($post = $stmt->fetchInto(new Post, "p")) {

	// fetch User object from users table (u is alias)
	$post->author = $stmt->fetchIntoFromLastRow(new User, "u");

	$post_collection[] = $post;
}

// You can send $post_collection from model to view in your controller, so here is usage in view
foreach($post_collection as $post) {
    echo $post->author->getName();
}

Insert

库有 insert 方法,用于轻松地将 数组或对象 作为行插入到数据库表中。请注意,所有其他与列名不匹配的属性或元素都将被忽略。

$data = array(
	"username" => "User 1234",
	"email" => "user@example.com",
	"mtime" => time()
);
$db->insert("users", $data);

使用预处理语句插入

insert() 方法的第三个参数是 "unique prepared stmt key"。每个具有该键的插入都将使用相同的预处理语句。

foreach($data_array as $data) {
	$db->insert("users", $data, "unique_stmt_key");
}

Update

一些更新语句的示例

$user_id = 1;
$db->update("users", $data, "user_id = ?", $user_id);
$db->update("users", $data, "user_id = ? AND email = ?", array(1, "user@example.com"));

保存数据

自动确定 INSERT 或 UPDATE。如果 $data['user_id'] 存在,则将执行 UPDATE,否则将执行 INSERT。

$db->save("users", $data, "user_id"); // user_id is name of PRIMARY column

更多示例

// Delete row in table
// some as $db->exec("DELETE FROM users WHERE user_id = 1");
$db->delete("users", "user_id = ?", $user_id);

// Count rows in table
$count = $db->count("users");

/* @var User[] $users Collection of User objects */
$users = $db->executeQuery("SELECT * FROM users")->fetchCollection(new User);

有关 Sakila 数据库的更多示例