Attacher une association¶
Objectif : créer une association pivot avec ses attributs.
Ce que vous allez apprendre : attach ajoute une ligne dans la table pivot.
On lui donne l'article_id, le tag_id et un dictionnaire d'attributs
(position, epingle). Seuls les champs déclarés dans la liste blanche sont
acceptés.
Premier palier du niveau intermédiaire.
Module opt-in : SQL visible
En production, le service délègue à core.database.db (execute,
fetch_one…). La table article_tag doit exister. Pour les tests, ces
exécuteurs sont injectables.
Classes Forge utilisées¶
| Méthode | Rôle dans ce starter | Référence |
|---|---|---|
PivotAdvancedService.attach(source_id, target_id, pivot_data) |
Crée l'association et retourne l'id inséré. | Pivot avancé |
Le contrôleur¶
# mvc/controllers/pivot_attach_controller.py
from core.http.request import Request
from core.http.response import Response
from core.mvc.controller.base_controller import BaseController
from forge_mvc_pivot import PivotAdvancedService
def _service() -> PivotAdvancedService:
return PivotAdvancedService(
table="article_tag",
source_key="article_id",
target_key="tag_id",
pivot_fields=["position", "epingle"],
)
class PivotAttachController(BaseController):
@staticmethod
def attach(request: Request) -> Response:
article_id = int(request.form("article_id", default="0"))
tag_id = int(request.form("tag_id", default="0"))
service = _service()
service.attach(article_id, tag_id, {"position": 1, "epingle": 0})
return Response.text(f"Tag {tag_id} attaché à l'article {article_id}.")
Comprendre ce code¶
attach(article_id, tag_id, {...})insère la ligne(article_id, tag_id, position, epingle)et retourne l'identifiant inséré.- Le dictionnaire d'attributs ne peut contenir que
positionetepingle:
un champ inconnu lève une erreur (liste blanche). - Le SQL produit est un
INSERTparamétré : aucune valeur n'est concaténée.
Doublon de paire
Tel quel, attacher deux fois la même paire crée deux lignes (ou échoue sur la
clé primaire SQL). Pour refuser le doublon avant l'INSERT, on active
unique_pair, au niveau avancé.
La route¶
# mvc/routes.py
from mvc.controllers.pivot_attach_controller import PivotAttachController
with router.group("", public=True) as public:
public.add("POST", "/pivot/attach", PivotAttachController.attach, name="pivot_attach")
À retenir¶
attachcrée l'association et écrit ses attributs.- Seuls les champs de la liste blanche sont acceptés.
- L'
INSERTest paramétré (pas d'injection).
Après ce starter¶
Une association existe. Voyons comment la modifier et la détacher.