Choisir un ORM, c’est un peu comme choisir entre un MacBook et un PC gamer : les deux font le job, mais l’un vous fait passer pour un hipster en meetup tandis que l’autre vous colle une réputation de dinosaure. Aujourd’hui, on compare Prisma, le chouchou de l’écosystème Node.js/TypeScript, et Doctrine, le vieux sage de PHP qui refuse de prendre sa retraite. En principe, aucun des deux ne vous sauvera d’une migration de base de données à 3h du matin, mais au moins, vous saurez lequel vous fera le moins râler.
Prisma : Le petit nouveau qui a tout compris (ou presque)
Prisma, c’est l’ORM qui a débarqué en mode « je suis là pour simplifier votre vie, les gars ». Et force est de constater qu’il a tapé dans le mille sur plusieurs points. D’abord, son Prisma Schema, un fichier unique où vous définissez vos modèles, vos relations et même vos migrations. Un vrai bonheur pour ceux qui en ont marre de jongler entre 15 fichiers XML et des annotations à n’en plus finir.
Exemple de schéma Prisma :
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
}
Simple, lisible, et surtout, typé. Parce que oui, Prisma est né dans l’écosystème TypeScript, et il assume. Plus de any qui traîne, plus de « pourquoi mon IDE me hurle dessus ? ». Tout est généré automatiquement, et votre éditeur de code vous remercie.
Autre point fort : les migrations. Avec prisma migrate dev, vous générez et appliquez vos migrations en une seule commande. Pas besoin de vous farcir un outil externe ou de prier pour que votre base de données ne se transforme pas en champ de ruines. Et si jamais vous faites une bêtise, prisma migrate reset est là pour tout remettre à zéro. Pratique, mais à utiliser avec précaution, sauf si vous aimez vivre dangereusement.
Côté performances, Prisma se défend bien. Il utilise un client généré statiquement, ce qui évite les surcoûts liés à la réflexion ou à l’introspection à l’exécution. En revanche, si vous avez besoin de requêtes ultra-complexes, vous risquez de devoir sortir le raw SQL ou de bidouiller avec $queryRaw. Parce que oui, même les ORM les plus malins ont leurs limites.
Le gros point noir de Prisma ? Son écosystème. Si vous sortez de Node.js/TypeScript, vous êtes un peu seul. Et si vous avez besoin d’intégrations exotiques, préparez-vous à mettre les mains dans le cambouis. Mais bon, à part ça, c’est du solide.
Doctrine, bon vieux fiable et solide
Doctrine, c’est l’ORM qui a vu naître PHP 5 et qui est toujours là, imperturbable, comme un vieux chien de garde qui refuse de lâcher son os. Et franchement, c’est plutôt rassurant. Parce que quand vous utilisez Doctrine, vous savez que vous êtes sur un outil qui a été testé, retesté, et qui a survécu à des générations de frameworks PHP.
Doctrine repose sur deux piliers : les Entities et le Doctrine Query Language (DQL). Les Entities, ce sont vos modèles, définis via des annotations (ou des fichiers YAML/XML si vous êtes un masochiste). Exemple :
/**
* @Entity
*/
class User
{
/**
* @Id
* @GeneratedValue
* @Column(type="integer")
*/
private $id;
/**
* @Column(type="string", unique=true)
*/
private $email;
/**
* @OneToMany(targetEntity="Post", mappedBy="author")
*/
private $posts;
// ... getters et setters
}
Oui, c’est verbeux. Oui, c’est moins sexy que le schéma de Prisma. Mais c’est aussi ultra-flexible. Doctrine vous laisse faire à peu près tout ce que vous voulez, y compris des trucs que vous regretterez plus tard. Et c’est là que réside sa force : il ne vous impose pas de conventions, il vous donne les outils pour faire ce que vous voulez.
Côté requêtes, le DQL est puissant, mais il a un goût de SQL qui aurait été passé à la moulinette. Si vous maîtrisez SQL, vous vous y retrouverez. Sinon, préparez-vous à quelques heures de documentation. Exemple :
$query = $entityManager->createQuery(
'SELECT u FROM User u JOIN u.posts p WHERE p.published = :published'
)->setParameter('published', true);
$users = $query->getResult();
Doctrine brille aussi par son intégration avec Symfony. Si vous êtes dans l’écosystème Symfony, vous n’avez même pas à vous poser la question : Doctrine est là, prêt à l’emploi, avec tous les outils qui vont avec (comme le MakerBundle pour générer vos entités). Et si vous avez besoin de performances, le QueryBuilder et le cache de Doctrine sont là pour vous sauver la mise.
Le gros défaut de Doctrine ? Son côté « usine à gaz ». Entre les annotations, les fichiers de configuration, les outils en ligne de commande, et les concepts comme les Repositories ou les UnitOfWork, la courbe d’apprentissage est raide. Et si vous venez de Prisma, vous allez avoir l’impression de remonter le temps. Mais une fois que vous avez passé le cap, c’est un outil redoutablement efficace.
Alors, Prisma ou Doctrine ? Le verdict (sans surprise)
Si vous êtes dans l’écosystème Node.js/TypeScript et que vous voulez un ORM simple, moderne et bien intégré, Prisma est fait pour vous. Il ne fera pas tout, mais il le fera bien, et sans vous prendre la tête. En revanche, si vous sortez de cet écosystème, vous risquez de vous sentir un peu seul.
Si vous êtes dans le monde PHP, surtout avec Symfony, Doctrine reste le roi. Oui, c’est complexe. Oui, c’est verbeux. Mais c’est aussi ultra-puissant, ultra-flexible, et surtout, ultra-stable. Et puis, avouons-le, utiliser Doctrine, c’est un peu comme conduire une vieille Mercedes : ça peut sembler dépassé, mais ça ne vous lâchera jamais.
Et si vous hésitez encore, posez-vous la question : est-ce que vous préférez un outil qui vous simplifie la vie au quotidien, ou un outil qui vous donne le contrôle absolu, même si ça signifie passer plus de temps à configurer qu’à coder ? Dans les deux cas, sachez une chose : aucun ORM ne vous sauvera d’une mauvaise conception de base de données. Alors choisissez bien, et surtout, choisissez en connaissance de cause.