sinasalek / pdoplus
PDO 封装器。扩展 PDO 和 PDOStatement 以添加有用的方法。
dev-master
2016-10-20 16:08 UTC
Requires
- php: >=5.3.0
- sorskod/db: ~1
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);