sinasalek/pdoplus

PDO 封装器。扩展 PDO 和 PDOStatement 以添加有用的方法。

dev-master 2016-10-20 16:08 UTC

This package is auto-updated.

Last update: 2024-08-29 03:31:30 UTC


README

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

API

因为库扩展了 PDO 驱动,所以您可以使用所有原生 PDO 方法以及新增的:###DB - 数据库类

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

###Statement

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

###Query - 构建 SQL 查询对象

  • select - SELECT 语句
  • from - FROM 语句
  • where - 添加新的 WHERE 语句。多个 WHERE 将通过 AND 连接
  • whereIn - 添加 WHERE IN (...) 语句
  • whereNotIn - 添加 WHERE NOT IN (...) 语句
  • having - HAVING 语句
  • join - 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");

选择

执行查询并检索 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 方法,可以轻松地将 数组或对象 作为行插入数据库表。请注意,所有其他不匹配列名属性或元素都将被忽略。

$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");
}

更新

一些更新语句的示例

$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 数据库的更多示例