Отказываясь от этого старого сообщения, я ищу способ обновить несколько Symfony entites в одном запросе sql – по соображениям оптимизации. У меня есть объект Content и метод в службе, который обновляет содержимое «sibling» с помощью setCurrent (0). Вот рабочий код:
/** * Set given content the latest regarding its siblings */ public function setLatestContent(Entity\Content $content) { // Get siblings entities $siblings = $this ->em ->getRepository('LPFrontRteBundle:Content') ->findBySibling($content); foreach ($siblings as $sibling_content) { $sibling_content->setCurrent(0); } $this->em->flush(); }
Хорошо, что работает. Но так как у меня есть 38 дочерних элементов, я получаю 38 SQL-запросов, таких как:
UPDATE mr_content SET current = 0 WHERE id = 55 UPDATE mr_content SET current = 0 WHERE id = 56 UPDATE mr_content SET current = 0 WHERE id = 57 ...
Я хотел бы использовать «чистую» систему Entity от Doctrine, чтобы иметь один запрос:
UPDATE mr_content SET current = 0 WHERE id = 55 OR id = 56 OR id = 57 ...
Будем очень благодарны за любые мысли о том, как добиться этого – или умнее обходной путь.
РЕДАКТИРОВАТЬ
Для записи, вот что я придумал – мне нравится эта многословная 🙂 С $ qb как построитель запросов.
$qb->update('LPFrontRteBundle:Content', 'c') ->set('c.current', 0) ->where('c.keyword = :keyword') ->setParameter('keyword', $content->getKeyword()) ->andWhere('c.locale = :locale') ->setParameter('locale', $content->getLocale()) ->andWhere('c.id != :id') ->setParameter('id', $content->getId()) ->getQuery()->execute();