WordPress ActiveRecord implements the active record pattern to easily retrieve, update and delete rows of database tables without struggling with raw SQL query strings.
The goal of this library is to provide a small but yet powerful ORM for the CMS WordPress, which should be easy to implement. Therefore it only consists of two classes: ActiveRecord
and Query
:
- The
ActiveRecord
class maps rows to object instances and the columns to object properties. - The
Query
class provides a fluent interface to create sql queries.
composer require friedolinfoerder/wp-activerecord
You can use the library in your plugin or directly in your functions.php
file. All you have to do is to require the ActiveRecord
class and define your model classes (e.g. Slideshow
):
// create a model class for the table {wp-prefix}slideshows
class Slideshow extends \wp_activerecord\ActiveRecord {
protected static $table_name = 'slideshows';
}
With this you can create new rows, update and save them like this:
// create new row
$slideshow = Slideshow::create([
'title' => 'Header slideshow',
'slide_time' => 3000,
'slide_effect' => 'fade'
]);
// retrieve by id...
$slideshow = Slideshow::get(1);
// ... and update the row
$slideshow->title = 'New title';
$slideshow->slide_effect = 'slide';
$slideshow->save();
- Class
ActiveRecord
- Class
Query
- Static methods
- Instance methods
- Method
select([$...])
- Method
delete()
- Method
update([$column [, $value]])
- Method
set($column [, $value])
- Method
insert($data)
- Method
where($column [, $type_or_value [, $value]])
- Method
and_where($column [, $type_or_value [, $value]])
- Method
or_where($column [, $type_or_value [, $value]])
- Method
group_by($column [, $order])
- Method
having($column [, $type_or_value [, $value]])
- Method
and_having($column [, $type_or_value [, $value]])
- Method
or_having($column [, $type_or_value [, $value]])
- Method
order_by($column [, $order])
- Method
limit($limit)
- Method
offset($offset)
- Method
join($table, $attribute, $foreign_attribute [, $type])
- Method
sql()
- Method
get_results()
- Method
get_row()
- Method
get_col()
- Method
get_var()
- Method
get()
- Method
get_one()
- Method
execute()
- Method
Cast row values to native types.
class Slideshow extends \wp_activerecord\ActiveRecord {
protected static $casts = [
'num_slides' => 'int',
'duration' => 'float',
'active' => 'boolean',
'created_at' => 'datetime',
];
}
Create a model with an array of attributes
$activeRecord = Table::create();
// or
$activeRecord = Table::create([
'name' => 'wp-activerecord',
'title' => 'WordPress ActiveRecord'
]);
Delete a row by id
Table::delete_by_id(3);
Get all model instances or a model instance by id
$activeRecords = Table::get(); // all records
$activeRecord = Table::get(3); // one record by id
Dynmamic finder method: Get a var, rows, results or model instances
$activeRecord = Table::get_one_by_title('WordPress');
$array = Table::get_by_name_or_title('wp-activerecord', 'WP');
$row = Table::get_row_by_name_and_title('wp', 'WP');
$var = Table::get_var_name_by_id(3);
Get the table name
$table_name = Table::get_table_name();
Insert one or multiple rows into the database
$last_insert_id = Table::insert([
'name' => 'wp-activerecord',
'title' => 'WordPress ActiveRecord'
]);
// or
$last_insert_id = Table::insert([[
'name' => 'ActiveRecord',
'title' => 'Class ActiveRecord'
], [
'name' => 'Query',
'title' => 'Class Query'
]]);
Get a query instance
$query = Table::query();
Shortcut method for creating a query instance and calling update on it
$query = Table::update('name', 'wp-activerecord-updated');
// or
$query = Table::update([
'name' => 'wp-activerecord-updated',
'title' => 'Updated WordPress ActiveRecord'
]);
Get the wpdb instance
$wpdb = Table::wpdb();
// use case:
$userInput = '20%';
Table::query()
->delete()
->where('name', 'like', '%' . Table::wpdb()->esc_like($userInput) . '%')
->execute();
Delete the model
$activeRecord->delete();
Save the model
$activeRecord->save();
Called before saving the model
// in your derived class:
protected function save_pre($isNew) {
$this->new = $isNew ? 1 : 0;
}
Called after saving the model
// in your derived class:
protected function save_post($isNew) {
// do something with $this
}
Called before deleting the model
// in your derived class:
protected function delete_pre() {
// do something with $this
}
Called after deleting the model
// in your derived class:
protected function delete_post() {
// do something with $this
}
Get the wpdb instance
$wpdb = Query::wpdb();
Select rows
$activeRecord = Table::query()
->select('id', 'name')
->get();
Delete rows
Table::query()
->delete()
->where('name', 'wp')
->execute();
Update rows (Alias for \wp_activerecord\Query::set)
Table::query()
->update()
->set('name', 'wp')
->execute();
// or
Table::query()
->update('name', 'wp')
->execute();
// or
Table::query()
->update([
'name' => 'wp',
'title' => 'WordPress'
])
->execute();
Set columns, which should be updated
Table::query()
->set('name', 'wp')
->execute();
// or
Table::query()
->set([
'name' => 'wp',
'title' => 'WordPress'
])
->execute();
Insert rows
Table::query()
->insert([
'name' => 'wp',
'title' => 'WordPress'
])
->execute();
// or
Table::query
->insert([[
'name' => 'ActiveRecord',
'title' => 'Class ActiveRecord'
], [
'name' => 'Query',
'title' => 'Class Query'
]])
->execute();
Add a where condition
$activeRecords = Table::query()
->where('name', 'wp')
->where('title', 'LIKE', '%active%')
->where([
'start' => 12,
'end' => 37
])
->where(['deleted_at', null]) // query for NULL value, produces `deleted_at` IS NULL
->where('value', '>', ['RAND()']) // raw value wrapped in array
->where('numbers', 'in', [[1, 2, 3]] // a array as raw value will be joined
->get();
Alias for where
.
Alias for where
, but adds a new group to the where clause, which will be added with the keyword OR
Add a group by section
$activeRecords = Table::query()
->group_by('name', 'asc')
->get();
Add a having condition
$activeRecords = Table::query()
->group_by('name')
->having(["SUM(price)"], ">", 10) // raw column value wrapped in array
->get();
Alias for having
.
Alias for having
, but adds a new group to the having clause, which will be added with the keyword OR
Add a order by section
$activeRecords = Table::query()
->order_by('description')
->order_by('name', 'desc')
->get();
Add a limit
$activeRecords = Table::query()
->limit(5)
->get();
Add a offset
$activeRecords = Table::query()
->offset(10)
->get();
Add a join condition
$activeRecords = Table::query()
->join('OtherTable', 'id', 'table_id')
->get();
Create the final sql statement
$sql = Table::query()
->select('description')
->where('description', 'like', 'Title: %')
->sql();
Get the results of the query
$results = Table::query()
->get_results();
Get the row of the query
$row = Table::query()
->where('name', 'this is a unique name')
->get_row();
Get the column of the query
$descriptions = Table::query()
->select('description')
->get_col();
Get the value of the query
$description = Table::query()
->select('description')
->where('name', 'this is a unique name')
->get_var();
Get the results of the query as an array of model instances
$activeRecords = Table::query()
->get();
Get the results of the query as a model instances
$activeRecord = Table::query()
->where('name', 'this is a unique name')
->get_one();
Execute the query
Table::query()
->delete()
->where('name', 'this is a unique name')
->execute();
This code is licensed under the MIT license.