Skip to content

Database - Getting Started ​

AvelPress provides a powerful database layer that abstracts WordPress database operations while maintaining compatibility with WordPress core functions. It includes query builders, migrations, and Laravel 12 Eloquent-style models.

Database Connection ​

AvelPress does not require additional connection configuration, as it uses WordPress's native $wpdb to handle database operations. All actions are performed using the same credentials and connection already set up in WordPress, ensuring seamless and secure integration.

Accessing the Database ​

php
use AvelPress\Facades\DB;

// Get the database instance
$db = DB::connection();

// Or use the facade directly
$users = DB::table('users')->get();

Query Builder ​

The query builder provides a fluent interface for building database queries:

Basic Queries ​

php
use AvelPress\Facades\DB;

// Select all records
$users = DB::table('users')->get();

// Select specific columns
$users = DB::table('users')->select('id', 'name', 'email')->get();

// Select with where clause
$user = DB::table('users')->where('id', 1)->first();

// Multiple where conditions
$users = DB::table('users')
    ->where('status', 'active')
    ->where('age', '>', 18)
    ->get();

Where Clauses ​

php
// Basic where
DB::table('users')->where('name', 'John')->get();

// Where with operator
DB::table('users')->where('age', '>', 18)->get();
DB::table('users')->where('age', '>=', 21)->get();

// Where in
DB::table('users')->whereIn('id', [1, 2, 3])->get();

// Where not in
DB::table('users')->whereNotIn('status', ['banned', 'suspended'])->get();

// Where null
DB::table('users')->whereNull('deleted_at')->get();

// Where not null
DB::table('users')->whereNotNull('email')->get();

// Where between
DB::table('products')->whereBetween('price', [10, 100])->get();

// Where like
DB::table('users')->where('name', 'like', '%john%')->get();

Ordering and Limiting ​

php
// Order by
$users = DB::table('users')->orderBy('name', 'asc')->get();
$users = DB::table('users')->orderBy('created_at', 'desc')->get();

// Multiple order by
$users = DB::table('users')
    ->orderBy('name', 'asc')
    ->orderBy('created_at', 'desc')
    ->get();

// Limit
$users = DB::table('users')->limit(10)->get();

// Offset and limit
$users = DB::table('users')->offset(20)->limit(10)->get();

// Take (alias for limit)
$users = DB::table('users')->take(5)->get();

// Skip (alias for offset)
$users = DB::table('users')->skip(10)->take(5)->get();

Aggregates ​

php
// Count
$count = DB::table('users')->count();
$activeCount = DB::table('users')->where('status', 'active')->count();

// Sum
$totalPrice = DB::table('orders')->sum('total');

// Average
$avgAge = DB::table('users')->avg('age');

// Min and Max
$minPrice = DB::table('products')->min('price');
$maxPrice = DB::table('products')->max('price');

Grouping and Having ​

php
// Group by
$stats = DB::table('orders')
    ->select('status', DB::raw('COUNT(*) as count'))
    ->groupBy('status')
    ->get();

// Having
$stats = DB::table('orders')
    ->select('user_id', DB::raw('SUM(total) as total_spent'))
    ->groupBy('user_id')
    ->having('total_spent', '>', 1000)
    ->get();

Insert, Update, Delete ​

Insert Operations ​

php
// Insert single record
$id = DB::table('users')->insert([
    'name' => 'John Doe',
    'email' => 'john@example.com',
    'created_at' => current_time('mysql')
]);

// Insert and get ID
$id = DB::table('users')->insertGetId([
    'name' => 'Jane Doe',
    'email' => 'jane@example.com'
]);

// Insert multiple records
DB::table('users')->insert([
    ['name' => 'User 1', 'email' => 'user1@example.com'],
    ['name' => 'User 2', 'email' => 'user2@example.com'],
]);

Update Operations ​

php
// Update records
DB::table('users')
    ->where('id', 1)
    ->update(['name' => 'Updated Name']);

// Update multiple fields
DB::table('users')
    ->where('status', 'inactive')
    ->update([
        'status' => 'active',
        'updated_at' => current_time('mysql')
    ]);

// Increment/Decrement
DB::table('posts')->where('id', 1)->increment('views');
DB::table('posts')->where('id', 1)->increment('views', 5);
DB::table('users')->where('id', 1)->decrement('credits');

Delete Operations ​

php
// Delete records
DB::table('users')->where('id', 1)->delete();

// Delete with multiple conditions
DB::table('users')
    ->where('status', 'banned')
    ->where('last_login', '<', '2023-01-01')
    ->delete();

// Truncate table
DB::table('temp_data')->truncate();

Joins ​

php
// Inner join
$users = DB::table('users')
    ->join('profiles', 'users.id', '=', 'profiles.user_id')
    ->select('users.name', 'profiles.bio')
    ->get();

// Left join
$users = DB::table('users')
    ->leftJoin('orders', 'users.id', '=', 'orders.user_id')
    ->select('users.name', 'orders.total')
    ->get();

// Multiple joins
$data = DB::table('users')
    ->join('profiles', 'users.id', '=', 'profiles.user_id')
    ->join('orders', 'users.id', '=', 'orders.user_id')
    ->select('users.name', 'profiles.bio', 'orders.total')
    ->get();

Raw Expressions ​

php
// Raw where clause
$users = DB::table('users')
    ->whereRaw('age > ? AND status = ?', [18, 'active'])
    ->get();

// Raw select
$stats = DB::table('orders')
    ->select(DB::raw('COUNT(*) as total_orders, SUM(total) as revenue'))
    ->first();

// Raw order by
$users = DB::table('users')
    ->orderByRaw('RAND()')
    ->limit(10)
    ->get();

Transactions ​

php
use AvelPress\Facades\DB;

// Manual transaction
DB::beginTransaction();

try {
    DB::table('users')->insert(['name' => 'John']);
    DB::table('profiles')->insert(['user_id' => DB::getPdo()->lastInsertId()]);

    DB::commit();
} catch (\Exception $e) {
    DB::rollback();
    throw $e;
}

// Transaction with closure
DB::transaction(function() {
    DB::table('users')->insert(['name' => 'John']);
    DB::table('profiles')->insert(['user_id' => DB::getPdo()->lastInsertId()]);
});

Pagination ​

php
// Simple pagination
$users = DB::table('users')
    ->where('status', 'active')
    ->paginate(15); // 15 items per page

// Get current page from request
$page = $_GET['page'] ?? 1;
$users = DB::table('users')->paginate(15, $page);

// Custom pagination
$perPage = 20;
$page = $_GET['page'] ?? 1;
$offset = ($page - 1) * $perPage;

$users = DB::table('users')
    ->offset($offset)
    ->limit($perPage)
    ->get();

$total = DB::table('users')->count();
$totalPages = ceil($total / $perPage);

WordPress Integration ​

Working with WordPress Tables ​

php
// Access WordPress core tables
$posts = DB::table('posts')
    ->where('post_status', 'publish')
    ->where('post_type', 'post')
    ->get();

$users = DB::table('users')
    ->join('usermeta', 'users.ID', '=', 'usermeta.user_id')
    ->where('usermeta.meta_key', 'wp_capabilities')
    ->get();

Custom Table Prefixes ​

php
// AvelPress automatically handles WordPress table prefixes
// But you can also specify custom prefixes for your plugin tables

// In your configuration
$prefix = $GLOBALS['wpdb']->prefix . 'myplugin_';

$data = DB::table($prefix . 'custom_table')->get();

WordPress Hooks Integration ​

php
// Use WordPress hooks with database operations
add_action('init', function() {
    $recentPosts = DB::table('posts')
        ->where('post_status', 'publish')
        ->where('post_date', '>', date('Y-m-d', strtotime('-7 days')))
        ->orderBy('post_date', 'desc')
        ->get();

    // Process recent posts
});

Error Handling ​

php
try {
    $result = DB::table('users')->insert([
        'name' => 'John Doe',
        'email' => 'john@example.com'
    ]);
} catch (\Exception $e) {
    // Handle database error
    error_log('Database error: ' . $e->getMessage());

    // Return error response
    return new \WP_Error('db_error', 'Database operation failed');
}

Performance Tips ​

Query Optimization ​

php
// Use select() to limit columns
$users = DB::table('users')
    ->select('id', 'name', 'email')  // Only fetch needed columns
    ->where('status', 'active')
    ->get();

// Use limit() for large datasets
$recentUsers = DB::table('users')
    ->orderBy('created_at', 'desc')
    ->limit(100)
    ->get();

// Use exists() instead of count() for existence checks
$hasActiveUsers = DB::table('users')
    ->where('status', 'active')
    ->exists();

Caching Results ​

php
// Cache database results
$cacheKey = 'active_users_count';
$count = wp_cache_get($cacheKey);

if ($count === false) {
    $count = DB::table('users')->where('status', 'active')->count();
    wp_cache_set($cacheKey, $count, '', 3600); // Cache for 1 hour
}

This database layer provides all the tools you need to work efficiently with data in your WordPress plugins and themes while maintaining clean, readable code.

Released under the MIT License.