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.