Bonjour,
J'ai en une entité article qui possede un champs position , qui definit l'ordre d'affichage des articles
j'ai une liste drag and drop qui permet de changer la position d'un article et qui envoit la nouvelle position de l'article à un controlleur , jusque à la tout vas bien
j'ai maintenant mon controlleur qui update la position de l'article
maintenant , j'ai besoin de pouvoir mettre à jours la position des autres articles
et la je ne vois pas bien ou le gerer et comment
Globalement en php cela serait
if ($old_position < $new_position)
{
$sql = "UPDATE article SET position = position+1 WHERE position >= :new_position AND position < :old_position ";
}else{
$sq = "UPDATE article SET position = position-1 WHERE position <= :new_position AND position > :old_position ";
}
Je vois bien une aproche avec le repo ou je ferais un findBy pour recuperer tout mes object en fonction des cas et je ferais un
setposition(getPosition() +1 ou -1)
mais je trouve cela pas du tout performant
n'y a t'il pas une meillleur approche pour le faire en lots ?
Ou mettriez vous cette operation (repo, entity, controlleur, event, ...) ?
Cordialement
Hello,
Tu as une extension Doctrine qui fait ça très bien et... automatiquement! Pourquoi ré-inventer la roue? ;)
https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/sortable.md
Sous Symfony, il faut installer le bundle de Stof : https://symfony.com/doc/current/doctrine/common_extensions.html
Bonjour Digivia
Dans un context projet , je passerait bien sur par un bundle
mais la c'est un context d'apprentisage et on me demande de ne pas utiliser de bundle autre que ceux de la core Team de Symfony
Hello, tu peux gérer ça avec du DQL. Voir la doc doctrine : https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/batch-processing.html.
Perso, je créerais un service dédié pour cela. Il faut gérer l'update, mais également l'insert (en dernière position) et aussi le delete (supression d'un article = ré-indexation des positions).