ExpressionEngine® User Guide

Legacy Documentation

You are using the documentation for version 4.3.8. Go here for the latest version.

Database Class

Calling the DB Class

ExpressionEngine has an abstract database layer that allows developers to easily access the MySQL database and also provide many features like automatic escaping of characters and query caching.

This class is initialized automatically:

$channels = ee()->db->select('channel_name')
  ->from('channels')
  ->get();

if ($channels->num_rows() > 0)
{
    foreach($channels->result_array() as $row)
    {
        echo $row['channel_name']."<br />\n";
    }
}

Active Record

While we still make ee()->db->query() available, it’s highly recommended that you use CodeIgniter’s Active Record because queries will be easier to read and edit:

$query = ee()->db->select('username, screen_name, email, url, signature')
    ->from('members m')
    ->join('my_table t', 'm.member_id = t.member_id')
    ->where(array(
        't.subscribed' => 'y',
        't.end_date >' => ee()->localize->now,
    ))
    ->limit($per_page)
    ->order_by('m.join_date', 'desc')
    ->get();

Note

We’re not adding exp_ to the beginning of the table names, CodeIgniter takes care of that automatically, so you can add it if you want, but it’s unnecessary.

SELECTing Data

When you perform a SELECT query using Active Record, a database object containing the results will be returned. To check for the number of results returned by the query, use the num_rows value in the returned object:

$results = ee()->db->select('*')
  ->from('channels')
  ->get();

if ($results->num_rows() == 0)
{
    exit('No channels exist');
}

Note

You don’t have to supply a select() or a from(), instead if you want to select everything simply omit the select(), and instead of adding a from(), just put the table name in the get():

$results = ee()->db->get('channels');

In many instances, you will know that only a single row of data will be returned from a query. Instead of looping through an array, you can simply use the row array in the object returned:

$results = ee()->db->order_by('channel_id')
  ->limit(1)
  ->get('channels');

$first_channel = $results->row('channel_name');

When many rows of data are returned you will wish to loop through the returned array and use the values returned for the fields. ExpressionEngine uses MYSQL_ASSOC, which has MySQL using the field names in the array and not numbers. To access this array, then you will want to use the result array of the object with a foreach loop:

$results = ee()->db->select('channel_name, channel_id')
  ->get('channels');

if ($results->num_rows() > 0)
{
    foreach($results->result_array() as $row)
    {
        echo $row['channel_id'].' - '.$row['channel_name']."<br />\n";
    }
}

INSERTing Data

Active Record includes insert(), insert_batch() and set() methods that makes the inserting of data into the database easier by correctly formatting the INSERT string and escaping the values being inserted. The insert() and insert_batch() methods accept the name of the table for the insert and an array containing the field names as keys with the values containing the data for those fields:

ee()->db->insert(
    'channel',
    array(
        'name'  => $name,
        'email' => $email,
        'url'   => $url
    )
);

Upon performing an insert you might wish to know the value of the primary key for the row that was added. Active Record tracks the last insert and will return the primary key value using the insert_id() method of the class:

ee()->db->insert('channel', array('name' => $name));
$entry_id = ee()->db->insert_id();

UPDATEing Data

Active Record also includes update() and update_batch() methods that makes the updating of data in the database easier by correctly formatting the UPDATE string and escaping the values being inserted. Both methods accept the name of the table for the update, an array containing the field names as keys with the values containing the updated data for those fields, and the WHERE clause for choosing which rows in the table to update:

ee()->db->update(
    'channel',
    array(
        'name'  => $name,
        'email' => $email,
        'url'   => $url
    ),
    array(
        'author_id' => '1'
    )
);

DELETEing Data

Like UPDATE’s and INSERT’s, Active Record has a delete() method for deleting data. It accepts a table name and a string or array containing the WHERE clause(s):

ee()->db->delete(
    'table',
    array(
        'id' => $id_to_delete
    )
);

Note

Always be wary of the data you’re deleting.

Additional Methods

affected_rows will return how many rows in the database were affected during the most recent query. Every so often a useful variable to have when performing INSERT, UPDATE, or DELETE queries:

ee()->db->delete('comments', array('url' => $site_url));
echo ee()->db->affected_rows()." rows were deleted.";