在 WordPress 中,直接通过 $wpdb
操作数据库是非常麻烦的,以至于很多新手看到 $wpdb
时很容易就望而却步了。而在 PHP的世界中,有一个特立独行的 ORM 框架:RedBean PHP,该 ORM 的特点就是身材苗条,功能强大,同时又非常简单易用,使用 RedBean PHP 操作数据库的时候,我们甚至不用事先创建数据库结构,直接保存数据就可以了,RedBean PHP会根据我们需要保存的数据类型,自动帮我们创建好数据库结构。下面我们来看一下RedBean PHP 的具体使用方法。
加载 rb.php,建立数据库连接
为什么说RedBean PHP的身材苗条呢,该框架只有一个 rb.php
文件,使用的时候,我们直接在 PHP 代码中包含这个文件,配置一下数据库连接就可以使用了。在 WordPress 中,连接数据需要的信息是以常亮的形式在 wp-config.php
文件中保存的,我们直接使用这些信息,新建数据库连接就可以了。
// 加载 RedBean PHP ORM
require_once( dirname( __FILE__ ) . '/rb.php' );
// 配置数据库连接
R::setup('mysql:host='. DB_HOST .';dbname='. DB_NAME , DB_USER, DB_PASSWORD);
R::setAutoResolve( TRUE );
在主题的 functions.php 中加入以上代码,WordPress 主初始化的时候,供 RedBean PHP 使用的数据库连接就自动建立好了,一旦建立了数据库连接,我们就可以使用 RedBean PHP 很方便的操作数据库了。
添加 WordPress 数据表前缀
默认情况下,RedBean PHP 用下划线来表示数据表之间的关系,而 WordPress 的数据库前缀也是用下划线表示的,如果直接添加下划线到数据表名称上,使用的时候就会报错。如果需要使用前缀,我们只需要给 RedBean PHP 创建一个小扩展就可以了。为了更方便记忆和使用数据表名称,我们可以把需要的自定义数据表名称都定义为常量。
R::ext('model', function( $type ){
return R::getRedBean()->dispense( $type );
});
define( 'BOOKS', 'wp_books' );
// 创建数据库的时候,直接使用model,代替 dispense 方法即可,如下。
$book = R::model( 'wp_books' );
创建模型,存取数据
RedBean PHP很方便的一个特性就是自动创建数据表结构,看一下下面的代码,‘books’
这个数据表在数据库中是不存在的,我们想要创建这个数据表,然后往里面保存数据。看看RedBean PHP是怎么做的,直接通过 dispense
方法分配一下数据表,然后直接定义数据,定义好后,直接保存,数据表的创建完全是透明的自动的,简直像魔法世界里面的魔豆一样好用有没有。
// 创建模型
$post = R::dispense( 'books' );
$post->text = 'Hello World';
$post->content = '你好,世界';
// 存储数据
$id = R::store( $post );
// 删除数据
R::trash( $book );
// 根据 ID获取数据
$books = R::load( 'books', $id );
// 根据某个条件获取一条数据
$book = R::findOne( 'book', ' title = ? ', [ 'SQL Dreams' ] );
//获取所有数据
$books = R::findAll( 'book' );
$books = R::findAll( 'book' , ' ORDER BY title DESC LIMIT 10 ' );
// 根据多个条件获取数据
R::find( 'books', ' course_id = ? AND member_id = ? ', [ $course->ID, $member->ID ] );
// 获取或创建数据
R::findOrCreate( 'books', [ 'member_id' => 2, 'lesson_id' => 3, 'course_id' => 3 ] );
// 获取数量
$count = R::count( 'book', ' pages > ? ', [ 250 ] );
// 模糊查询
R::findLike( 'flower', [
'color' => ['yellow', 'blue']
], ' ORDER BY color ASC ' );
实现分页查询数据
实现分页需要用到总数据量、每页现实的数据量和当前页面这三个数据,下面的示例代码中,我们使用了 Nette Paginator 这个 PHP 库来帮我们实现分页。
use Nette\Utils\Paginator;
$paginator = new Paginator;
// 所有数据
$all = R::find( PAY, ' pid = ? ', [ 79 ] );
// 页面
$page = ( isset( $_GET['page'] ) ) ? $_GET['page'] : 1;
// 设置分页
$paginator->setItemCount( count( $all ) );
$paginator->setItemsPerPage( 2 );
$paginator->setPage( $page );
// 获取查询用的参数
$limit = $paginator->getLength();
$offset = $paginator->getOffset();
$payments = R::find( PAY, ' pid = ? LIMIT ? OFFSET ?', [ 79, $limit, $offset ] );
有了这个 ORM,我们在开发WordPress 应用的时候,就不用局限于现有的数据表了,可以根据随心所欲的根据需要创建应用自己的数据表,并且很方便的存储和保存数据。详细的介绍和教程请直接参考官方文档。