Question Update Entity en lots

Default
,

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

3 Réponse

87112
,

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

Default
,

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

87112
,

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).