WordPress ORM

1.0.0 2014-09-09 18:22 UTC

This package is not auto-updated.

Last update: 2024-09-17 06:35:26 UTC


README

WordPress ORM 是一个小的库,它将基本的 ORM 添加到 WordPress 中,易于扩展,包括文章、页面、评论和用户等核心 WordPress 模型。它旨在允许你轻松地添加新的模型,除了自定义文章类型,而且不需要编写大量的手动 SQL。

安装

虽然你可以像普通插件一样安装和激活它,但我建议将其放在 /wp-content/mu-plugins 文件夹中,并添加一个名为 wp-orm.php 的脚本以加载主要插件文件(只有从 mu-plugins 加载顶级 .php 文件)。

wp-orm.php:

<?php require 'wp-orm/wp-orm.php';

示例

获取5篇已发布的文章,按文章标题排序。

use WordPress\ORM\Model\Page;

$pages = Page::query()
	->limit(5)
	->where('post_status', 'publish')
	->sort_by('post_title')
	->order('ASC')
	->find();

通过登录名查找用户

use WordPress\ORM\Model\User;

$user = User::find_one_by('user_login', 'brandon');

echo $user->get_user_login();

print_r($user->to_array());

更复杂查询的示例

use WordPress\ORM\Model\Post;

$posts = Post::query()
	->limit(15)
	->offset(0)
	->where_all(['post_status' => 'publish', 'post_type' => 'post'])
	->where_like('post_title', '%Hello world%')
	->sort_by('post_title')
	->order('ASC')
	->find();

更新模型

use WordPress\ORM\Model\Post;

$post = Post::find_one(1204);
$post->set_post_title('What an amazing post!');
$post->save();

元数据

用户、文章、页面和评论都支持元数据。

$post = Post::find_one(1337);
$post->get_metadata('_edit_lock');
$post->update_metadata('_edit_lock', '');
$post->delete_metadata('_edit_lock');

元数据会立即使用 WordPress 元数据函数在内部保存。调用 save() 不需要。

自定义模型

<?php

namespace WordPress\ORM;

class Venue extends BaseModel
{
	protected $id;
	protected $venue_title;
	protected $description;
	protected $now_playing;
	protected $location;
	protected $avg_rating;

	public static function get_primary_key()
	{
		return 'id';
	}

	public static function get_table()
	{
		return 'wp_venues';
	}

	public static function get_searchable_fields()
	{
		return ['venue_title', 'description', 'now_playing'];
	}
}

你现在可以使用这个场所,将其持久化,并使用上面显示的定制查询 DSL 查询它。

模型方法

Model::get_table()

这是一个必须在你的模型中定义的静态方法,应该返回持久化数据到的表。

Model::get_searchable_fields()

这是一个必须在你的模型中定义的静态方法,应该返回一个数组,表示在执行搜索查询时搜索的属性。

Model::get_primary_key()

返回用作主键的属性。默认为 id

Model::create(array $properties)

从一个属性数组创建一个新的模型。

Model::find_one_by(string $property, mixed $value)

查找具有指定属性值的单个模型。

Model::find_one(integer $id)

查找主键等于给定 ID 的单个模型。

Model::query()

返回一个新的 WordPress\ORM\Query 对象。

Model::all()

返回数据库中的每个模型。

$model->primary_key()

返回模型的主键(值,而不是属性名称)。

$model->to_array()

返回模型的所有属性作为数组。

$model->flatten_props(array $props)

在调用 save() 之前调用,应该将属性中的任何对象扁平化为字符串,以便它们可以被持久化。默认将 DateTime 对象扁平化为时间戳,将数组扁平化为序列化数组。

$model->save()

将你的模型保存到数据库中。如果模型没有 ID,则创建新行,如果存在 ID,则更新现有行。

$model->delete()

从数据库中删除模型。如果成功返回 true,如果失败返回 false

ORM 查询

以下是在调用 Model::query() 函数后可以访问的函数。

$query->limit(integer $limit)

使用 SQL LIMIT 子句限制返回的结果数量。

$query->offset(integer $offset)

偏移返回的结果,用于分页。使用 SQL OFFSET 子句。

$query->sort_by(string $property)

按指定的属性排序结果。也可以是 MySQL 函数,如 RAND()

$query->order(string $order)

按照给定的顺序排列结果。可以是 ASCDESC 之一。

$query->search(string $search_term)

将结果限制为匹配给定搜索词的项目。搜索 Model::get_searchable_fields 返回的属性。

$query->where(string $property, string $value)

向 where 子句添加参数。等同于 WHERE $property = '$value'$value 将自动转义。

$query->where_not(string $property, string $value)

向 where 子句添加参数。等同于 WHERE $property != '$value'$value 将自动转义。

$query->where_like(string $property, string $value)

向 where 子句添加参数。等同于 WHERE $property LIKE '$value'$value 将自动转义。

$query->where_not_like(string $property, string $value)

向 where 子句添加参数。等同于 WHERE $property NOT LIKE '$value'$value 将自动转义。

$query->where_lt(string $property, string $value)

向 where 子句添加参数。等同于 WHERE $property < '$value'$value 将自动转义。

$query->where_lte(string $property, string $value)

向 where 子句添加参数。等同于 WHERE $property <= '$value'$value 将自动转义。

$query->where_gt(string $property, string $value)

向 where 子句添加参数。等同于 WHERE $property > '$value'$value 将自动转义。

$query->where_gte(string $property, string $value)

向 where 子句添加参数。等同于 WHERE $property >= '$value'$value 将自动转义。

$query->where_in(string $column, array $in)

将结果限制为给定列的值之一的项目。等同于 WHERE $property IN ('value1', 'value2'),其中 value1value2 是数组中的值。

$query->where_not_in(string $column, array $in)

将结果限制为给定列不是给定值之一的项目。等同于 WHERE $property NOT IN ('value1', 'value2'),其中 value1value2 是数组中的值。

$query->where_any(array $where)

将结果限制为匹配数组中给出的任何属性/值对的项目。必须至少匹配一个。

$query->where_all(array $where)

将结果限制为匹配数组中给出的所有属性/值对的项目。

操作 & 过滤

wporm_query($sql, $model_class)

操作由 Query 类创建的原始 SQL 查询。

add_filter('wporm_query', function($sql, $model_class) {
	if ($model_class == 'WordPress\ORM\Model\Page') {
		$sql = str_replace('wp_posts', 'wp2_posts', $sql);
	}

	return $sql;
}, 10, 2);

wporm_count_query($sql, $model_class)

操作由 Query 类创建的原始 SQL 查询(行数变体)。

add_filter('wporm_count_query', function($sql, $model_class) {
	if ($model_class == 'WordPress\ORM\Model\Page') {
		$sql = str_replace('wp_posts', 'wp2_posts', $sql);
	}

	return $sql;
}, 10, 2);

许可证

此代码受 MIT 许可证许可。