Symfony2: получить сущность и изменить ее ==> SQLSTATE [23000]: нарушение ограничения целостности: 1062 Дублирующаяся запись '1-170' для ключа 'PRIMARY' - PullRequest
2 голосов
/ 20 марта 2012

У меня есть сущность, и я хотел бы изменить некоторые значения.

Итак

  1. Я получаю свою сущность
  2. Я изменяю значения
  3. Я сохраняю свою сущность и сбрасываю

... Но у меня есть эта ошибка:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1-170' for key 'PRIMARY' 

Здесь код

/**
 *
 * @ORM\Table(name="entity")
 * @ORM\Entity(repositoryClass="App\Bundle\Entity\EntityRepository")
 * @ORM\OrderBy({"date" = "ASC"})
 */
class Entity
{
      /**
      * @var integer $id
      *
      * @ORM\Column(name="id", type="integer")
      * @ORM\Id
      * @ORM\GeneratedValue(strategy="AUTO")
      */
     private $id; 
     // ...
}

Я получаю своюсущность, подобная этой:

function get(){
       $query = $repository->createQueryBuilder('E')
        ->select ('E')          
            ->where('(E.type=:type) AND (E.m = :id)')
            ->setParameter('type',  $pType)
            ->setParameter('id',  $pMediaId)
        ->getQuery();
        return $query->getResult();
 }

И персит

$entity = $this->em->get(); // I have the correct value
entity->setTitle('My new title');
$this->em->persist($entity);

$this->em->flush();

Пожалуйста, помогите мне

Увидимся

Сэм

Ответы [ 3 ]

2 голосов
/ 20 марта 2012

вам не нужно сохранять сущность. вам нужно только сбросить изменения, продолжая попытки создать новую запись.

EDIT:

Напрямую из SF2 Документация:

http://symfony.com/doc/current/book/doctrine.html

Обновление объекта включает всего три шага:

  1. извлечение объекта из Доктрины;
  2. изменение объекта;
  3. вызов flush () для менеджера сущностей

Обратите внимание, что вызов $ em-> persist ($ product) не обязателен. Напомним, что этот метод просто говорит Doctrine управлять или «наблюдать» за объектом $ product. В этом случае, так как вы получили объект $ product из Doctrine, он уже управляем.

Я сталкивался с подобными проблемами, когда редактирование сущностей и устранение персистентного исправило проблему. Извините, на этот раз это было не так.

1 голос
/ 08 июля 2012
function get(){
   $query = $repository->createQueryBuilder('E')
    ->select ('E')          
        ->where('(E.type=:type) AND (E.m = :id)')
        ->setParameter('type',  $pType)
        ->setParameter('id',  $pMediaId)
    ->getQuery();
    return $query->getResult();
}

Этот метод всегда будет возвращаться как коллекция объектов, даже если вы фильтруете по ID. Поэтому, если вам нужно получить одну строку, вам нужно вызвать $query->getSingleResult() вместо $query->getResult(). Я думаю, что это проблема здесь, поскольку вы пытаетесь обновить как

$entity = $this->em->get(); // I have the correct value
entity->setTitle('My new title');
$this->em->persist($entity);

$this->em->flush();
0 голосов
/ 21 марта 2012

Проблема была в том, что я добавил сущность в мои ManyToOne отношения ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...