huunguyen/wp-query-builder

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

dev-master 2022-10-03 08:51 UTC

This package is auto-updated.

Last update: 2024-09-30 01:23:20 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::tableQuery::from命令。必须在任何WHERE条件之后调用delete方法,否则将删除整个表。

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

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

错误处理

错误地调用方法(例如,在没有先调用Query::table的情况下调用Query::get,或者传递一个未包含在查询结果中的字段给getColumn)会导致抛出LogicException(可能是BadMethodCallExceptionInvalidArgumentException)。

如果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

}