Skip to main content

Database

Framework cung cấp ORM và Query Builder mạnh mẽ với Connection Pooling cho hiệu năng cao.

Cấu hình

// config/database.php
return [
'default' => 'mysql',

'connections' => [
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', 3306),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'pool' => [
'min_connections' => 1,
'max_connections' => 10,
],
],
],
];

Query Builder

Select Queries

use Vietiso\Core\Database\DB;

// Lấy tất cả records
$users = DB::table('users')->get();

// Lấy record đầu tiên
$user = DB::table('users')->first();

// Lấy theo ID
$user = DB::table('users')->find(1);

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

// Alias
$users = DB::table('users')
->select('id', 'name as full_name')
->get();

Where Clauses

// Where cơ bản (column, value, operator)
// Mặc định operator là '='
$users = DB::table('users')
->where('status', 'active')
->get();

// Với operator (tham số thứ 3)
$users = DB::table('users')
->where('age', 18, '>=')
->get();

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

// Or Where
$users = DB::table('users')
->where('role', 'admin')
->orWhere('role', 'moderator')
->get();

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

// Where Not In
$users = DB::table('users')
->whereNotIn('status', ['banned', 'inactive'])
->get();

// Where Null / Not Null
$users = DB::table('users')
->whereNull('deleted_at')
->get();

$users = DB::table('users')
->whereNotNull('email_verified_at')
->get();

// Where Between
$orders = DB::table('orders')
->whereBetween('created_at', ['2024-01-01', '2024-12-31'])
->get();

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

// Where Contains (shorthand for LIKE %value%)
$users = DB::table('users')
->whereContains('name', 'john')
->get();

// Where với array conditions
$users = DB::table('users')
->where([
'status' => 'active',
'role' => 'admin',
])
->get();

// Where Any - match bất kỳ column nào
$users = DB::table('users')
->whereAny(['name', 'email'], '%john%', 'like')
->get();

// Where All - match tất cả columns
$users = DB::table('users')
->whereAll(['status', 'role'], 'active')
->get();

Where Date/Time

// Where Date
$orders = DB::table('orders')
->whereDate('created_at', '2024-01-15')
->get();

// Với operator
$orders = DB::table('orders')
->whereDate('created_at', '2024-01-15', '>=')
->get();

// Where Month
$orders = DB::table('orders')
->whereMonth('created_at', '01')
->get();

// Where Year
$orders = DB::table('orders')
->whereYear('created_at', '2024')
->get();

// Where Day
$orders = DB::table('orders')
->whereDay('created_at', '15')
->get();

// Where Time
$orders = DB::table('orders')
->whereTime('created_at', '10:00:00', '>=')
->get();

Where Column

// So sánh 2 columns
$users = DB::table('users')
->whereColumn('updated_at', 'created_at', '>')
->get();

// Với array
$users = DB::table('users')
->whereColumn([
['updated_at', '>', 'created_at'],
['name', 'username'],
])
->get();

Subqueries

// Where Exists
$users = DB::table('users')
->whereExists(function ($query) {
$query->table('orders')
->whereColumn('orders.user_id', 'users.id');
})
->get();

// Where In với subquery
$users = DB::table('users')
->whereIn('id', function ($query) {
$query->table('orders')
->select('user_id')
->where('total', 1000, '>');
})
->get();

Ordering & Limiting

// Order By
$users = DB::table('users')
->orderBy('created_at', 'desc')
->get();

// Order By Desc shorthand
$users = DB::table('users')
->orderByDesc('created_at')
->get();

// Latest / Oldest
$users = DB::table('users')->latest()->get(); // ORDER BY created_at DESC
$users = DB::table('users')->oldest()->get(); // ORDER BY created_at ASC
$users = DB::table('users')->latest('updated_at')->get();

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

// Hoặc
$users = DB::table('users')
->limit(10, 20) // limit, offset
->get();

Aggregates

// Count
$count = DB::table('users')->count();

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

// Sum/Avg
$total = DB::table('orders')->sum('amount');
$average = DB::table('products')->avg('price');

// Exists
if (DB::table('users')->where('email', $email)->exists()) {
// User tồn tại
}

// Doesn't Exist
if (DB::table('users')->where('email', $email)->doesntExist()) {
// User không tồn tại
}

Joins

// Inner Join (column1, column2, operator)
$users = DB::table('users')
->join('orders', 'users.id', 'orders.user_id')
->select('users.*', 'orders.total')
->get();

// Với operator khác
$users = DB::table('users')
->join('orders', 'users.id', 'orders.user_id', '=')
->get();

// Left Join
$users = DB::table('users')
->leftJoin('profiles', 'users.id', 'profiles.user_id')
->get();

// Right Join
$users = DB::table('users')
->rightJoin('orders', 'users.id', 'orders.user_id')
->get();

// Join với callback (advanced conditions)
$users = DB::table('users')
->join('orders', function ($join) {
$join->on('users.id', 'orders.user_id')
->where('orders.status', 'completed');
})
->get();

// Join Sub Query
$latestOrders = DB::table('orders')
->select('user_id', DB::raw('MAX(created_at) as last_order'))
->groupBy('user_id');

$users = DB::table('users')
->joinSub($latestOrders, 'latest_orders', function ($join) {
$join->on('users.id', 'latest_orders.user_id');
})
->get();

Group By & Having

// Group By
$orders = DB::table('orders')
->select('user_id')
->addSelectRaw('SUM(total) as total_amount')
->groupBy('user_id')
->get();

// Having (column, value, operator)
$orders = DB::table('orders')
->select('user_id')
->addSelectRaw('SUM(total) as total_amount')
->groupBy('user_id')
->having('total_amount', 1000, '>')
->get();

// Having Raw
$orders = DB::table('orders')
->selectRaw('user_id, SUM(total) as total')
->groupBy('user_id')
->havingRaw('SUM(total) > ?', [1000])
->get();

Insert

// Insert single record
DB::table('users')->insert([
'name' => 'John',
'email' => 'john@example.com',
]);

// Insert và lấy ID
$id = DB::table('users')->insertGetId([
'name' => 'John',
'email' => 'john@example.com',
]);

// Insert nhiều records
DB::table('users')->insert([
['name' => 'John', 'email' => 'john@example.com'],
['name' => 'Jane', 'email' => 'jane@example.com'],
]);

// Insert or Ignore
DB::table('users')->insertOrIgnore([
'email' => 'john@example.com',
'name' => 'John',
]);

// Update or Insert
DB::table('users')->updateOrInsert(
['email' => 'john@example.com'], // conditions
['name' => 'John Doe'] // values to update/insert
);

Update

// Update với where
DB::table('users')
->where('id', 1)
->update(['name' => 'John Doe']);

// Increment
DB::table('products')
->where('id', 1)
->increment('stock', 5);

// Increment với additional fields
DB::table('products')
->where('id', 1)
->increment('stock', 5, ['updated_at' => now()]);

// Decrement
DB::table('products')
->where('id', 1)
->decrement('stock', 2);

// Increment/Decrement nhiều columns
DB::table('products')
->where('id', 1)
->incrementEach([
'views' => 1,
'downloads' => 2,
]);

Delete

// Delete với where
DB::table('users')
->where('id', 1)
->delete();

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

Transactions

use Vietiso\Core\Database\DB;

// Transaction với callback
$result = DB::query()->transaction(function () {
DB::table('users')->insert([...]);
DB::table('profiles')->insert([...]);
return true;
});

// Manual transaction
DB::query()->beginTransaction();
try {
DB::table('users')->insert([...]);
DB::table('profiles')->insert([...]);
DB::query()->commit();
} catch (\Exception $e) {
DB::query()->rollBack();
throw $e;
}

Raw Queries

// Select Raw
$users = DB::table('users')
->selectRaw('COUNT(*) as total, status')
->groupBy('status')
->get();

// Add Select Raw
$users = DB::table('users')
->select('name')
->addSelectRaw('(SELECT COUNT(*) FROM orders WHERE orders.user_id = users.id) as orders_count')
->get();

// Where Raw
$users = DB::table('users')
->whereRaw('YEAR(created_at) = ?', [2024])
->get();

// Order By Raw
$users = DB::table('users')
->orderByRaw('FIELD(status, "active", "pending", "inactive")')
->get();

Pagination

// Pagination cơ bản
$users = DB::table('users')->paginate(15);

// Với page cụ thể
$users = DB::table('users')->paginate(15, page: 2);

// Fast Paginate (hiệu quả hơn với dữ liệu lớn)
$users = DB::table('users')->fastPaginate(15);

Cursor (Memory Efficient)

// Xử lý từng record một - tiết kiệm memory
foreach (DB::table('users')->cursor() as $user) {
// Process $user
}

Locking

// Lock for update
$user = DB::table('users')
->where('id', 1)
->lockForUpdate()
->first();

// Shared lock
$user = DB::table('users')
->where('id', 1)
->sharedLock()
->first();

Debug

// Xem SQL query
$sql = DB::table('users')
->where('status', 'active')
->toSql();

// Xem SQL với bindings
$rawSql = DB::table('users')
->where('status', 'active')
->toRawSql();

// Pretty print
$rawSql = DB::table('users')
->where('status', 'active')
->toRawSql(pretty: true);

// Explain query
$explain = DB::table('users')
->where('status', 'active')
->explain();