Symfony2 - 更新一对一关系中的实体


Symfony2 - Updating an entity in a one-to-one relationship

我正在尝试更新我的单一任务实体,但不接受任何更改。我的事件和单一任务之间的关系是双向一对一的关系。

我的事件实体的相关部分是:

class Event
{
   // properties
   /**
    * @OneToOne(targetEntity="SingleTask", mappedBy="event", cascade={"persist", "remove"})
    */
   private $singletask;
   public function setSingleTask(SingleTask $singletask)
   {
      $this->singletask = $singletask;
      $singletask->setEvent($this);
   }
   public function getSingleTask()
   {
      return $this->singletask;
   }
}

我的单一任务实体的相关部分是:

/**
 * @Entity
 */
class SingleTask
{
   /**
    * @Column(type="datetime", nullable=true)
    */
   private $lastRun;
   /**
     * @OneToOne(targetEntity="Event", inversedBy="singletask")
     * @JoinColumn(name="event_id", referencedColumnName="id", nullable=true)
     **/
   private $event;
   public function setLastRun('DateTime $lastRun = null)
   {
      $this->lastrun = $lastRun;
   }
}

在单独的命令文件中:

$eventRepo = $this->em->getRepository('HeyRemy'HeyRemyBundle'Entity'Event');
$events = $eventRepo->findAll();
foreach ($events as $event)
{
   $singletask = $event->getSingleTask();
   if ($singletask != null)
   {
      $singletask->setLastRun(new 'DateTime);
      $event->setSingleTask($singletask);
      $this->em->flush();
   }
}

遗憾的是,单个任务上的 lastRun 属性永远不会在数据库中更新。什么是不正确的?

编辑:如何创建事件的代码示例:

$event = new Event();
$userRepo = $this->em->getRepository('HeyRemyBundle:User');
$user = $userRepo->find($user_id);
$event->setUser($user);
$this->em->persist($event);
$this->em->flush();
$event_id = $event->getId();
// other code which uses $event_id (SingleTask does not)
$singletask = new SingleTask();
$singletask->setNextRun($event_start);
$this->em->persist($singletask);
$event->setSingleTask($singletask);
$this->em->flush();

从评论中 - 事实证明这是$lastRun变量的简单错别字。 映射到数据库的变量是$lastRun ,但您的设置正在执行$this->lastrun;

由于变量名称在 PHP 中区分大小写,因此您只是创建了一个新的公共类变量,但它并未映射到数据库。 如果你使用PHP的严格模式处理错误,它会捕获这个并抛出错误。

以下是更新的代码:

公共函数 setLastRun(''DateTime $lastRun = null) { $this->上次运行 = $lastRun; }

我当然会回答一些荒谬的问题,但我认为您的代码中唯一缺少的是:

$this->em->persist($event);
$this->em->flush();

我希望这能解决你的问题!