Model


Overview

In your plugin, you may use the Database Model class instead of the Query Builder.

To use the Model convention, you need to extend the WPKirk\WPBones\Database\Model class:

<?php
namespace WPKirk\Http\Controllers;
 
use WPKirk\WPBones\Database\Model;
 
class Users extends Model
{
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'users';
}
⚠️

We don’t support the automatic plurar naming of the table at the moment. Anyway, the default table name will be the “snake case” of the class name. For example, the class Users will be associated with the table users. The class UsersLogged will be associated with the table users_logged.

If your model’s corresponding database table does not fit this convention, you may manually specify the model’s table name by defining a table property on the model:

<?php
namespace WPKirk\Http\Controllers;
 
use WPKirk\WPBones\Database\Model;
 
class Users extends Model
{
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'logged_users';
}

Using the php bones make:model Bones command, we can quickly create a Model.

WordPress prefix

As you know, the real name of the table logged_users is {prefix}_logged_users. Usually, {prefix} is wp_ for default. Anyway, you don’t need to use the WordPress prefix, WP Bones will do that for you.

Remove the WordPress prefix

Starting from version 1.7.0, you can remove the WordPress prefix. You may use the usePrefix property in the model class:

use WPKirk\WPBones\Database\Model;
 
class Users extends Model
{
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'logged_users';
 
    protected $usePrefix = false;
}

Primary Keys

Model will also assume that each model’s corresponding database table has a primary key column named id. If necessary, you may define a protected $primaryKey property on your model to specify a different column that serves as your model’s primary key:

<?php
namespace WPKirk\Http\Controllers;
 
use WPKirk\WPBones\Database\Model;
 
class Users extends Model
{
    /**
     * The primary key associated with the table.
     *
     * @var string
     */
    protected $primaryKey = 'user_id';
}

Retrieving Models

Once you have created a model and its associated database table, you are ready to start retrieving data from your database. You can think of each model as a powerful query builder allowing you to fluently query the database table associated with the model. The model’s all method will retrieve all of the records from the model’s associated database table:

<?php
use WPKirk\Plugin\Model\Users;
 
foreach (Users::all() as $user) {
    echo $user->user_login;
}

Building Queries

The Query Builder all method will return all of the results in the model’s table. However, since each Model serves as a query builder, you may add additional constraints to queries and then invoke the get method to retrieve the results:

$users = Users::where('id', '>', 1)
               ->orderBy('user_login')
               ->limit(10)
               ->get();

Accessors & Mutators

An accessor transforms an attribute value when it is accessed. To define an accessor, create a get{Attribute}Attribute method on your model where {Attribute} is the “studly” cased name of the column you wish to access.

Defining An Accessor

In this example, we’ll define an accessor for the display_name attribute. The accessor will automatically be called by WP Bones model when attempting to retrieve the value of the display_name attribute:

<?php
namespace WPKirk\Http\Controllers;
 
use WPKirk\WPBones\Database\Model;
 
class Users extends Model
{
    /**
     * Get the user's display name.
     *
     * @param  string  $value
     * @return string
     */
    public function getDisplayNameAttribute($value)
    {
        return strtoupper($value);
    }
}

As you can see, the original value of the column is passed to the accessor, allowing you to manipulate and return the value. To access the value of the accessor, you may simply access the display_name attribute on a model instance:

use WPKirk\Http\Controllers\Users;
 
$user = Users::find(1);
 
$display_name = $user->display_name; // will be in upper case

You are not limited to interacting with a single attribute within your accessor. You may also use accessors to return new, computed values from existing attributes:

/**
 * Get the user's full name.
 *
 * @return string
 */
public function getFullNameAttribute()
{
    return "{$this->user_nicename} {$this->display_name}";
}

Defining a Mutator

A mutator transforms an attribute value when it is set. To define a mutator, define a set{Attribute}Attribute method on your model where {Attribute} is the “studly” cased name of the column you wish to access.

Let’s define a mutator for the display_name attribute. This mutator will be automatically called when we attempt to set the value of the display_name attribute on the model:

<?php
namespace WPKirk\Http\Controllers;
 
use WPKirk\WPBones\Database\Model;
 
class Users extends Model
{
    /**
     * Set the user's first name.
     *
     * @param  string  $value
     * @return void
     */
    public function setDisplayNameAttribute($value)
    {
        $this->attributes['display_name'] = strtolower($value);
    }
}

The mutator will receive the value that is being set on the attribute, allowing you to manipulate the value and set the manipulated value on the model’s internal $attributes property. To use our mutator, we only need to set the display_name attribute on the model:

use WPKirk\Http\Controllers\Users;
 
$user = Users::find(1);
 
$user->display_name = 'JOHN'; // will be stored in lower case
$user->save();