---
description: Pièges MySQL et Eloquent récurrents sur ce projet (DDL/transaction, FK longues, $table, relations)
alwaysApply: true
---

# Pièges MySQL / Eloquent (projet Envol)

## Migrations MySQL
- NE JAMAIS wrapper du DDL (`CREATE TABLE`, `ALTER TABLE`) dans `DB::transaction()` — MySQL fait un commit implicite → erreur "no active transaction".
- Sur une table au nom long, NOMMER EXPLICITEMENT et COURT les contraintes de clé étrangère. Le nom auto-généré par Laravel peut dépasser la limite MySQL de 64 caractères (erreur 1059 "Identifier name too long").

## Modèles Eloquent
- Définir `protected $table = '...'` EXPLICITEMENT sur tout modèle dont le nom se pluralise mal en anglais (noms français, ex. `DemandeJuridique` → table `demandes_juridiques` et non `demande_juridiques`). Laravel ne met le "s" qu'au dernier mot.
- Toute relation chargée en `with()` / `load()` doit être vérifiée manuellement contre les relations RÉELLEMENT déclarées sur le modèle. `RelationNotFoundException` est un fatal runtime invisible au lint et souvent aux tests.
- Sur une requête list avec JOIN, préfixer TOUTES les colonnes des clauses WHERE/scope par le nom de table (éviter l'ambiguïté "Column is ambiguous").

## Colonnes / tables métier
- Ne pas inventer de noms de colonnes ni confondre les tables proches — voir `schema-colonnes-reelles` (`programmes.libelle`, `lots_commerciaux`, enseignes via `aModule`, etc.).
