private function positionRelateArticle($relatedArticles, $relatedArticle, $position) { if ($position == false) { return; } $this->initOrderOnRelatedArticles($relatedArticles); try { $this->em->getConnection()->exec('LOCK TABLES context_articles WRITE, context_articles as c0_ WRITE;'); // check if position isn't bigger that max one; $maxPosition = $this->em->createQuery('SELECT COUNT(r) FROM Newscoop\\Entity\\RelatedArticle r WHERE r.articleListId = :articleListId AND r.order > 0 ORDER BY r.order ASC')->setParameter('articleListId', $relatedArticles->getId())->getSingleScalarResult(); if ($position > (int) $maxPosition) { $position = (int) $maxPosition; } // get article - move to position 0 $oldOrder = $relatedArticle->getOrder(); $relatedArticle->setOrder(0); $this->em->flush(); // move all bigger than old position up (-1) $this->em->createQuery('UPDATE Newscoop\\Entity\\RelatedArticle r SET r.order = r.order-1 WHERE r.order > :oldPosition')->setParameter('oldPosition', $oldOrder)->execute(); // move all bigger than new position down (+1) $this->em->createQuery('UPDATE Newscoop\\Entity\\RelatedArticle r SET r.order = r.order+1 WHERE r.order >= :newPosition')->setParameter('newPosition', $position)->execute(); // move changed element from position 0 to new position $relatedArticle->setOrder($position); $this->em->flush(); $this->em->getConnection()->exec('UNLOCK TABLES;'); } catch (\Exception $e) { $this->em->getConnection()->exec('UNLOCK TABLES;'); } }