diff --git a/index.md b/index.md
index 35c7a794e936e35087872916368f3111ce238421..0679bfbcb25d9778d855fbbb9c5e9ab8a8f79f94 100644
--- a/index.md
+++ b/index.md
@@ -202,6 +202,63 @@ Note:
 - On peut faire plusieurs constructeurs nommés
 - On peut passer le constructeur en privé pour encourager l'utilisation des
   constructeurs nommés.
+---
+### Les repositories
+
+```php
+final class DoctrineArticleRepository implements ArticleRepository
+{
+    public function __construct(EntityManagerInterface $entityManager)
+    {
+        $this->entityManager = $entityManager;
+    }
+
+    public function latestArticles(int $size): iterable
+    {
+        $this->entityManager->createQueryBuilder()
+          ->select('a.*')
+          ->from(Article::class)
+          ->orderBy('a.createdAt', 'DESC')
+          ->setMaxResults($size)
+          ->getQuery()
+          ->getResults();
+    }
+}
+```
+
+Note:
+- `Repository`, c'est un pattern, et il vaut mieux définir les vôtres sous
+  forme d'interface.
+- Plus l'interface est grosse, plus elle devient difficile à implémenter, et le
+  code qui consomme l'API a rarement besoin de faire beaucoup d'appels, du
+coup… slide suivant
+
+---
+# Les Query functions
+
+```php
+final class DoctrineGetLatestArticles implements GetLatestArticles
+{
+    public function __construct(EntityManagerInterface $entityManager)
+    {
+        $this->entityManager = $entityManager;
+    }
+
+    public function __invoke(int $size): iterable
+    {
+        $this->entityManager->createQueryBuilder()
+          ->select('a.*')
+          ->from(Article::class)
+          ->orderBy('a.createdAt', 'DESC')
+          ->setMaxResults($size)
+          ->getQuery()
+          ->getResults();
+    }
+}
+```
+
+Note:
+- Tout de suite beaucoup plus simple à réimplémenter en elasticsearch
 
 ---
 # Emoji test