2014-01-21 3 views
0

Я пытаюсь обновить строку в объекте с помощью:Doctrine 2 с ZF2 как обновить строку

$linker = $this->getObjectManager()->getRepository('\Schema\Entity\Link')->find('link_id', 7853); 
      $linker->setSampleTitle($mytitle); 
      $linker->setSampleDesc($mydesc); 

      $this->getObjectManager()->merge($linker); 
      $this->getObjectManager()->flush(); 

Но я получаю: открытой транзакции требуется для этой операции.

+0

На самом деле оба ваши 'найти () 'подходы правильные. Однако первый «запрашивает таблицу», второй «запрашивает базу данных» - так сказать ... Как указано @doeni, вы просто использовали неправильную функцию для сохранения обновленного объекта. Это 'persist()' то, что вы ищете вместо 'merge()' – Sam

+0

Привет, правда, что я полностью удалил $ this-> getObjectManager() -> merge ($ linker); и используя метод, который я опубликовал ниже, он работал без использования 'persist' и' merge'. Я использовал только 'merge'beacause, я читал его в другом сообщении, не зная, что именно делает. Требуется ли использовать 'persist()'? – Nikitas

+0

Да, я тоже это забыл. Обновление требует только промывки ... Сохранение не требуется, так как все это обрабатывается внутренне в случае редактирования. flush() будет записывать его в БД – Sam

ответ

2

Я только что понял, что внутри метода find() я не должен ставить 'link_id', но класс \Schema\Entity\Link. Так getRepository() не нужен здесь ...

Correct является: $linker= $this->getObjectManager()->find('\Schema\Entity\Link', 7853);

+0

У вас есть это. Пожалуйста, отметьте свой собственный ответ в качестве решения. –

2

Попробуйте это:

$this->getObjectManager()->persist($linker); 
$this->getObjectManager()->flush(); 

Также вы можете использовать findOneBy вместо находке.

0
$Link = $this->getObjectManager->getRepository('Schema\Entity\Link')->find(7853); 

и определить link_id как идентификатор в Entity по @Id или использовать ключевое слово findBy

Смежные вопросы