Почему мой тип объекта в моей сущности doctrine2 не обновляется при вызове persist () & flush ()? - PullRequest
4 голосов
/ 27 апреля 2011

Вот что я делаю:

    $entity = new Meta();
    $obj = new stdClass();
    $obj->foo = 15;
    $obj->bar = 0;
    $obj->bor = true;
    $entity->setObject($obj);
    $em->persist($entity);
    $em->flush();

    $entity = $entityRepository->find(1);
    var_dump($entity);

возвращается:

object(Jo\Model\Entity)[130]
  protected 'id' => int 1
  protected 'user' => null
  protected 'object' => 
    object(stdClass)[105]
      public 'foo' => int 15
      public 'bar' => int 0
      public 'bor' => boolean true

    $entity->getObject()->bar = 9;
    var_dump($entity);

возвращается:

object(Jo\Model\Entity)[130]
  protected 'id' => int 1
  protected 'user' => null
  protected 'object' => 
    object(stdClass)[105]
      public 'foo' => int 15
      public 'bar' => int 9
      public 'bor' => boolean true   

!

    $em->persist($entity);
    $em->flush();

Но после сброса сущность не обновляется в базе данных.

Возможно, это потому, что я устанавливаю новый объект из метода getObject (), и он имеет какое-то отношение к ссылкам или около того, но я не понимаю, почему второй var_dump () показывает правильные значения в объект.

Получатель довольно прост и состоит только в возврате частной собственности.

Любые идеи, я хотел бы понять это поведение.

1 Ответ

4 голосов
/ 27 апреля 2011

Я не был уверен в этом поведении, но мне было любопытно, поэтому я коротко рассказал об этом на IRC с Джонатаном Вейджем, одним из разработчиков Doctrine.

По словам Джона, причина такого поведения в том, что когда вы отображаете объект непосредственно на свойство, как вы делаете, вы должны клонировать объект - другими словами, вам нужен новый экземпляр.

При проверке, изменились ли ваши данные, D2 проверяет, совпадает ли объект со старым. Он просто выполняет сравнение типов x === y, поэтому, если у вас нет полностью нового экземпляра , он не распознает данные как измененные.

...