Database

ZephyrPHP uses Doctrine ORM for database operations, providing a powerful and flexible way to work with your data.

Configuration

Configure your database connection in .env:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_database
DB_USERNAME=your_username
DB_PASSWORD=your_password

Supported Databases

Database Connection Default Port
MySQL mysql 3306
PostgreSQL pgsql 5432
SQLite sqlite N/A

SQLite Configuration

For SQLite, just set the connection type:

DB_CONNECTION=sqlite

The database file will be created at storage/database.sqlite.

Database Connection

Access the database connection:

<?php

use ZephyrPHP\Database\Database;

// Get the database instance
$db = Database::getInstance();

// Get the Doctrine EntityManager
$em = $db->getEntityManager();

// Get the DBAL Connection
$connection = $db->getConnection();

Raw Queries

Execute raw SQL queries when needed:

<?php

$db = Database::getInstance();
$connection = $db->getConnection();

// Select query
$users = $connection->fetchAllAssociative(
    'SELECT * FROM users WHERE active = ?',
    [true]
);

// Insert query
$connection->insert('users', [
    'name' => 'John Doe',
    'email' => 'john@example.com'
]);

// Update query
$connection->update('users',
    ['name' => 'Jane Doe'],  // Data
    ['id' => 1]              // Where
);

// Delete query
$connection->delete('users', ['id' => 1]);

Query Builder

Use Doctrine's query builder for more complex queries:

<?php

$db = Database::getInstance();
$qb = $db->getConnection()->createQueryBuilder();

$users = $qb
    ->select('u.*')
    ->from('users', 'u')
    ->where('u.active = :active')
    ->andWhere('u.created_at > :date')
    ->setParameter('active', true)
    ->setParameter('date', '2024-01-01')
    ->orderBy('u.name', 'ASC')
    ->setMaxResults(10)
    ->fetchAllAssociative();

Transactions

Wrap database operations in transactions:

<?php

$db = Database::getInstance();
$connection = $db->getConnection();

try {
    $connection->beginTransaction();

    $connection->insert('orders', ['user_id' => 1, 'total' => 100]);
    $orderId = $connection->lastInsertId();

    $connection->insert('order_items', [
        'order_id' => $orderId,
        'product_id' => 5,
        'quantity' => 2
    ]);

    $connection->commit();
} catch (\Exception $e) {
    $connection->rollBack();
    throw $e;
}

Or use the transactional helper:

$db->getConnection()->transactional(function($connection) {
    $connection->insert('orders', ['user_id' => 1, 'total' => 100]);
    // More operations...
});

Using Models

While you can use raw queries, ZephyrPHP encourages using Models with Doctrine ORM for type-safety and cleaner code.

<?php

use App\Models\User;

// Find by ID
$user = User::find(1);

// Find with conditions
$users = User::query()
    ->where('active', '=', true)
    ->orderBy('created_at', 'DESC')
    ->all();

// Create
$user = new User();
$user->name = 'John Doe';
$user->email = 'john@example.com';
$user->save();

// Update
$user = User::find(1);
$user->name = 'Jane Doe';
$user->save();

// Delete
$user = User::find(1);
$user->delete();
Learn More

See the Models documentation for detailed information on working with Doctrine entities.

Schema Management

Use Doctrine's schema tool or migrations to manage your database schema:

# Create schema from entities
php craftsman doctrine:schema:create

# Update schema to match entities
php craftsman doctrine:schema:update

# Validate schema
php craftsman doctrine:schema:validate
Production Warning

In production, always use migrations instead of schema:update to safely manage database changes.

Multiple Connections

Configure multiple database connections in config/database.php:

<?php

return [
    'default' => env('DB_CONNECTION', 'mysql'),

    'connections' => [
        'mysql' => [
            'driver' => 'pdo_mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            // ...
        ],

        'analytics' => [
            'driver' => 'pdo_pgsql',
            'host' => env('ANALYTICS_DB_HOST'),
            'database' => env('ANALYTICS_DB_DATABASE'),
            // ...
        ],
    ],
];