Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Doctrine2 обновляет отношения "многие ко многим"

Автор вопроса: DmitroОтветов: 1

У меня есть отношения "многие ко многим" с сущностью "Продукт" и сущностью "Функция продукта":

/**
 * @ORM\ManyToMany(targetEntity="Feature")
 * @ORM\JoinTable(name="Product_Feature",
 *      joinColumns={@ORM\JoinColumn(name="Product_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="Feature_id", referencedColumnName="id")}
 *      )
 */
private $features;

Сущность объекта:

/**
 * @ORM\ManyToMany(targetEntity="Product", mappedBy="features")
 * @ORM\OrderBy({"position" = "ASC"})
 */
private $products;

ProductRepository.php:

public function updateFeatures($id, $featuresIds)
    {
        return $this->getEntityManager()->createQueryBuilder()
                ->update('TestCatalogBundle:Product', 'p')
                ->set('p.features', ':features')
                ->where('p.id = :id')
                ->setParameter('features', $featuresIds)
                ->setParameter('id', $id)
                ->getQuery()
                ->getResult();
    }

Но когда я вызываю updateFeatures, я получаю сообщение об ошибке:

features = :features': Ошибка: Недопустимое выражение пути. Ожидается StateFieldPathExpression или SingleValuedAssociationField

Как я могу обновить таблицу Product_Feature? Также я не могу удалить все функции из Product_Feature по идентификатору продукта.
Я изменил свой контроллер следующим образом:

    $em = $this->getDoctrine()->getEntityManager();

    $features = $em->getRepository('TestCatalogBundle:Feature')->findBy(array('id' => $featureIds));
    $product = $em->getRepository('TestCatalogBundle:Product')->find($id);

    $product->getFeatures()->clear();
    foreach ($features as $feature) {
        $product->addFeature($feature);
    }
    $em->persist($product);
    $em->flush();

Но если я использую собственный sql, мне нужно 2 запроса для удаления функций и вставки новых функций. Но здесь мне нужно 2 запроса на выборку. Может я неправильно поставил задачу?

  • Ответ: см. ответ, который я дал на stackoverflow.com/a/35445060/2423563. SudarP 17.02.2016

symfonyormdoctrine-orm

Ответы

Ответ 1 · рейтинг 2 · Nanocom

Вы делаете это неправильно. Вам следует прочитать эту главу документации: Работа с ассоциациями. Вы должны добавить ключевое слово "inversedBy" в поле $features класса Product.

Когда у вас есть двунаправленное отношение "многие ко многим", обычный способ сделать это:

$product->getFeatures()->add($feature); // Or $product->setFeatures($features);
$feature->getProducts()->add($product);
$em->persist($product);
$em->persist($feature);
$em->flush();

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы