Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.

Eloquent Wrapper for WordPress

This is a library package to use Laravel's Eloquent ORM with WordPress.

Package Installation

To install this package, edit your composer.json file:

    "require": {
        "tareq1988/wp-eloquent": "dev-master"

Now run:

$ composer install

Usage Example

Basic Usage

$db = \WeDevs\ORM\Eloquent\Database::instance();

var_dump( $db->table('users')->find(1) );
var_dump( $db->select('SELECT * FROM wp_users WHERE id = ?', [1]) );
var_dump( $db->table('users')->where('user_login', 'john')->first() );

// OR with DB facade
use \WeDevs\ORM\Eloquent\Facades\DB;

var_dump( DB::table('users')->find(1) );
var_dump( DB::select('SELECT * FROM wp_users WHERE id = ?', [1]) );
var_dump( DB::table('users')->where('user_login', 'john')->first() );

Creating Models For Custom Tables

You can use custom tables of the WordPress databases to create models:

namespace Whatever;

use WeDevs\ORM\Eloquent\Model;

class CustomTableModel extends Model {

     * Name for table without prefix
     * @var string
    protected $table = 'table_name';

     * Columns that can be edited - IE not primary key or timestamps if being used
    protected $fillable = [

     * Disable created_at and update_at columns, unless you have those.
    public $timestamps = false;

    /** Everything below this is best done in an abstract class that custom tables extend */

     * Set primary key as ID, because WordPress
     * @var string
    protected $primaryKey = 'ID';

     * Make ID guarded -- without this ID doesn't save.
     * @var string
    protected $guarded = [ 'ID' ];

     * Overide parent method to make sure prefixing is correct.
     * @return string
    public function getTable()
        // In this example, it's set, but this is better in an abstract class
        if ( isset( $this->table ) ){
            $prefix =  $this->getConnection()->db->prefix;
            return $prefix . $this->table;

        return parent::getTable();


Retrieving All Rows From A Table

$users = $db->table('users')->get();

foreach ($users as $user) {

Here users is the table name without prefix. The prefix will be applied automatically.

Other Examples

Writing a Model

use \WeDevs\ORM\Eloquent\Model as Model;

class Employee extends Model {


var_dump( Employee::all()->toArray() ); // gets all employees
var_dump( Employee::find(1) ); // find employee with ID 1

The class name Employee will be translated into PREFIX_employees table to run queries. But as usual, you can override the table name.

In-built Models for WordPress

  • Post
  • Comment
  • Post Meta
  • User
  • User Meta
use WeDevs\ORM\WP\Post as Post;

var_dump( Post::all() ); //returns only posts with WordPress post_type "post"

Filter Post by post_status and post_type

use WeDevs\ORM\WP\Post as Post;
var_dump(Post::type('page')->get()->toArray()); // get pages
var_dump(Post::status('publish')->get()->toArray()); // get posts with publish status
var_dump(Post::type('page')->status('publish')->get()->toArray()); // get pages with publish status

How it Works

  • Eloquent is mainly used here as the query builder
  • WPDB is used to run queries built by Eloquent
  • Hence, we have the benfit to use plugins like debug-bar or query-monitor to get SQL query reporting.
  • It doesn't create any extra MySQL connection

Minimum Requirement

  • PHP 5.6.4+
  • WordPress 4.0+


Tareq Hasan