stephenharris/wp-query-builder

基于Laravel Query Builder的WordPress表达式查询构建器

0.2.2 2018-07-25 15:58 UTC

README

基于Laravel Query Builder的WordPress表达式查询构建器。封装了全局变量 $wpdb

Build Status

如何在受管理环境中使用

如果您想在受管理环境中使用此扩展,只需使用 composer 安装即可

composer require stephenharris/wp-query-builder

如何使用查询构建器

include('vendor/autoload.php');

global $wpdb;
$qb = new WPQueryBuilder\Query($wpdb);

如何在分布式插件中使用

由于无法管理插件之间的依赖关系,将此库捆绑到插件中可能会造成错误(可能是致命错误),如果与另一个包含它的插件一起使用。

在您的插件中捆绑此库的安全方法是使用 Mozart。它会复制代码库,但将其封装在自定义命名空间中。

您需要处理库类的自动加载。它们可以根据PSR-4从Mozart目标目录进行自动加载。

global $wpdb;
$qb = new YourPluginNameSpace\WPQueryBuilder\Query($wpdb);

数据净化

此库的目的是提供一种 表达式化安全 的方法来对WordPress数据库运行查询(通常涉及自定义表)。

为此,所有提供的 都被转义,但请注意,列名和表名 还没有被转义。无论如何,即使它们被转义,您也应该列出允许的列/表:否则,使用用户输入或其他不可信数据来确定列/表可能会导致攻击者检索不应检索的数据或生成您的数据库映射。

查询结果

检索表中的所有行

$qb->select()->from("wp_users")->get();
//SELECT * FROM wp_users;

检索单行

$qb->select()->from("wp_users")->where("user_email", "=", "admin@example.com")->first();
//SELECT * FROM wp_users WHERE user_email = 'admin@example.com' LIMIT 1;

检索单列

要检索返回结果中的第一列

$usernames = $qb->select(["user_login", "user_email"])->from("wp_users")->getColumn();

要检索特定列

$emails = $qb->select(["user_login", "user_email"])->from("wp_users")->getColumn("user_email");

要检索值

$email = $qb->select("user_email")->from("wp_users")->where("ID", "=", 123)->getScalar();

基本WHERE子句

添加 WHERE 子句,匹配列值等于/不等于/大于/小于/大于等于/小于等于(=/, !=, >, <, >=, <=)的记录;

$qb->select()
    ->from("wp_posts")
    ->where("post_status", "=", "publish")
		->andWhere("post_date", ">=", "2018-05-31 10:00:00")
		->get();
//SELECT * FROM wp_posts WHERE post_status='publish' AND post_date >= "2018-05-31 10:00:00";

要添加 OR 条件,使用 orWhere($column, $operator, $value)

WHERE列值IN

添加 WHERE 子句,匹配列值在提供的数组中的记录;

$qb->select()->from("wp_users")->whereIn("ID", [1, 2, 3])->get();
//SELECT * FROM wp_users WHERE ID IN (1, 2, 3);

WHERE列值IN

添加 WHERE 子句,匹配列值在提供的数组中的记录;

$qb->select()->from("wp_users")->whereIn("ID", [1, 2, 3])->get();
//SELECT * FROM wp_users WHERE ID IN (1, 2, 3);

WHERE列值BETWEEN

添加 WHERE 子句,匹配列值在两个指定值之间的记录;

$qb->select()->from("wp_posts")->whereBetween("post_date", '2018-05-01 00:00:00', '2018-05-31 23:59:59')->get();
//SELECT * FROM wp_posts BETWEEN '2018-05-01 00:00:00' AND '2018-05-31 23:59:59';

搜索字段

对一个或多个字段执行 LIKE 比较操作。

$qb->select()->from("wp_posts")->search("post_title", "foo")->get();
//SELECT * FROM wp_posts WHERE post_title='%foo%';

要搜索多个列,可以传递列名数组;

$qb->select()->from("wp_posts")->search(["post_title", "post_content", "post_excerpt"], "foo")->get();
//SELECT * FROM wp_posts WHERE post_title='%foo%' OR post_content='%foo%' OR post_excerpt='%foo%';

复杂WHERE子句

andWhere(及其别名 where)和 orWhere 也接受 WhereCause 实例。这允许构建更复杂的查询,例如嵌套的 WHERE 条件。

$privateAndAuthor = new WPQueryBuilder\CompositeWhereClause();
$privateAndAuthor->andWhere(new WPQueryBuilder\BasicWhereClause('post_status', '==', 'private'))
$privateAndAuthor->andWhere(new WPQueryBuilder\BasicWhereClause('post_author', '==', 1));

$qb->select()
	->from("wp_posts")
	->where($privateAndAuthor)
	->orWhere("post_status", '=', "publish")
	->get();

//SELECT * FROM wp_posts WHERE (post_status = 'private' AND  post_author = 1) OR post_status = 'publish';

连接

有四种连接方法

$query->select(['wp_posts.*', 'u.user_nicename'])
 ->('wp_posts')
 ->leftJoin('wp_users as u', 'wp_posts.post_author', '=', 'u.ID');

// SELECT wp_posts.*, u.user_nicename FROM wp_posts LEFT JOIN wp_users as u ON wp_posts.post_author = u.ID;

方法

  • leftJoin($table, $firstColumn, $operator, $secondColumn)
  • rightJoin($table, $firstColumn, $operator, $secondColumn)
  • innerJoin($table, $firstColumn, $operator, $secondColumn)
  • fullJoin($table, $firstColumn, $operator, $secondColumn)

插入记录

Query::insert 方法将使用给定的列/值(给定数组,其中列是键)插入记录。您必须使用 Query::table 并指定表的名称。

$qb->table("wp_posts")
	->insert(
		"post_title" => "My Post Title",
		"post_content" => "My post content...",
		"post_status" => "publish",
	);

// INSERT INTO wp_posts (post_title, post_content, post_status) VALUES ('My Post Title', 'My post content...', 'publish');

删除记录

《Query::delete》方法将通过指定的表执行删除命令,通过《Query::table》或《Query::from》命令实现。必须先调用任何where条件,然后再调用《delete》方法,否则您将删除整个表。

$qb->table("wp_posts")
	->where("ID", "=", 123)
	->delete();

// DELETE FROM wp_posts WHERE ID='123';

错误处理

方法调用错误(例如,在调用《Query::table》之前调用《Query::get》,或将未包含在查询结果中的字段传递给《getColumn》)将导致《LogicException》异常(要么是《BadMethodCallException》,要么是《InvalidArgumentException》)。

如果SQL查询失败,则抛出《WPQueryBuilder(QueryException》异常。

try {
	$qb->set([
			'ID' => 5,
			'post_title' => 'Updating a post'
   	])
	 	->where('ID', '=', 3)
	 	->update();
} catch (\LogicException $e) {

	// There is an error in your code

} catch (\WPQueryBuilder\QueryException $e) {

	// This could be data conflict

}