2016-02-24 2 views
1

У меня есть проблема с одним из моих действий в контроллере. Я хочу изменить один единственный атрибут объекта (опубликовать дату небольшого объявления).менеджер по управлению: persist не работает, нет сообщения об ошибке

Я получаю определенное небольшое объявление из репозитория, изменяю значение атрибута, а менеджер объектов должен сохранять объект. Это отлично работает с несколькими другими атрибутами, но не с датой validTo.

Моя проблема в том, что я не получаю сообщение об ошибке. Когда я пишу значение каждого шага в файл журнала, оно имеет правильное значение. Даже когда я получаю атрибут через $smallad->getValidTo() после метода $em->flush() (чтобы сократить код, я удалил все строки ведения журнала). Но я не получаю никаких изменений в базе данных, и значение не сохраняется.

Я использую этот контроллер действий для изменения некоторых значений атрибутов в нескольких других контроллерах без каких-либо проблем. И без правильного сообщения об ошибке я не знаю, с чего начать искать решение. Есть идеи?

public function extendAction($id) 
{ 
    $repository = $this->getDoctrine()->getRepository('AppBundle:SmallAd'); 
    $smallad = $repository->findOneBy(array('id'=>$id)); 

    $em = $this->getDoctrine()->getManager(); 
    $date = $smallad->getValidTo()->modify('+31 days'); 
    $smallad->setValidTo($date); 
    $em->persist($smallad); 
    $em->flush(); 

    return new RedirectResponse($this->generateUrl('member')); 
} 
+1

Просто небольшая заметка - вам не нужно 'сохраняться()' в этом случае, так как вы работаете на объекте, который уже удалось, потому что вы извлечь его с помощью 'findOneBy()' метод. Вы также можете сократить команду 'findOneBy()' с помощью '$ smalladd = $ repository-> find ($ id);', если у вас есть '$ id', определяемый как ваше основное значение« Id »на вашей сущности. –

ответ

4

Doctrine 2 использует ссылки на объекты, чтобы определить, когда свойство дата была изменена, и, таким образом, необходимо иметь обновление базы данных: http://doctrine-orm.readthedocs.org/en/latest/cookbook/working-with-datetime.html

Это немного противоречит интуитивным. Вы обновили дату, но сохранили тот же объект даты и, следовательно, не изменили. Достаточно легко исправить клонированием дата:

$date = $smallad->getValidTo()->modify('+31 days'); 
$smallad->setValidTo(clone $date); 
+2

Если используется php> = 5.5, полезно использовать 'DateTimeImmutable'. Я не тестировал его с помощью Doctrine, но, похоже, библиотека добавила поддержку для него здесь - https://github.com/VasekPurchart/Doctrine-Date-Time-Immutable-Types –

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

  • Нет связанных вопросов^_^