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é
});