Database

River inclut un wrapper léger autour de PDO, optimisé pour SQLite (mais compatible autres drivers), avec gestion des transactions et requêtes préparées.

Configuration

Configurez l'accès dans .env ou config.php :

DB_CONNECTION=sqlite
DB_PATH=/var/www/var/database.sqlite

Utilisation

Injectez River\Database dans vos classes.

class UserController extends Controller {
    public function __construct(
        private Database $db
    ) {}

    public function index() {
        // SELECT (retourne un tableau d'objets stdClass)
        $users = $this->db->select("SELECT * FROM users WHERE active = ?", [1]);
        // $users[0]->name, $users[0]->email...

        // SELECT ONE (retourne un objet ou null)
        $user = $this->db->select_one("SELECT * FROM users WHERE id = ?", [1]);
        // $user->name, $user->email...
    }
}

CRUD Helpers

Des méthodes simplifiées pour les opérations courantes :

// INSERT (retourne le dernier ID inséré)
$id = $this->db->insert('users', [
    'email' => 'test@example.com',
    'name' => 'Jean'
]);

// UPDATE (retourne le nombre de lignes affectées)
$count = $this->db->update('users', 
    ['name' => 'Jean Dupont'], // SET
    'id = ?',                  // WHERE
    [$id]                      // WHERE params
);

// DELETE
$this->db->delete('users', 'id = ?', [$id]);

Fetch Mode

Par défaut, select() et select_one() retournent des objets stdClass. Vous pouvez passer un fetch_mode PDO pour obtenir des tableaux associatifs :

// Par défaut : objets stdClass
$users = $db->select("SELECT * FROM users");
// $users[0]->name

// Tableaux associatifs (override)
$users = $db->select("SELECT * FROM users", [], PDO::FETCH_ASSOC);
// $users[0]['name']

Avec Crud_trait, le mode par défaut est également FETCH_OBJ. Pour utiliser des tableaux, définissez $crud_fetch_mode :

class Users_ctrl extends Controller {
    use Crud_trait;

    // Par défaut : $user->name (objets)
    // Pour des tableaux : décommenter la ligne suivante
    // protected int $crud_fetch_mode = PDO::FETCH_ASSOC;
}

Transactions

Gérez vos transactions atomiques via une closure. Rollback automatique en cas d'erreur.

$this->db->transaction(function($db) {
    $db->insert('orders', [...]);
    $db->insert('order_items', [...]);
    // Si une exception est levée ici, rien n'est inséré
});