简体   繁体   English

Symfony2-以一对一关系更新实体

[英]Symfony2 - Updating an entity in a one-to-one relationship

I am trying to update my SingleTask entity however no change is accepted. 我正在尝试更新我的SingleTask实体,但是不接受任何更改。 The relationship between my Event and SingleTask is a bi-directional one-to-one relationship. 我的事件和SingleTask之间的关系是双向的一对一关系。

The relevant portions of my Event entity are: 我的事件实体的相关部分是:

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;
   }
}

The relevant portions of my SingleTask entity are: 我的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;
   }
}

In a separate command file: 在单独的命令文件中:

$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();
   }
}

Unfortunately, the lastRun property on the SingleTask is never updated in the database. 不幸的是,SingleTask的lastRun属性永远不会在数据库中更新。 What is not correct? 什么不正确?

Edit: Code samples of how I create an event: 编辑:我如何创建事件的代码示例:

$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();

Surely I will answer something absurd, but I think the only thing missing in your code is : 我当然会回答一些荒谬的事情,但是我认为您的代码中唯一缺少的是:

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

I hope this will solve your problem ! 希望这能解决您的问题!

From the comments - it turns out this was a simple typo of the $lastRun variable. 从注释中可以看出,这只是$lastRun变量的简单错字。 The variable mapped to the database is $lastRun , but your setting is doing $this->lastrun; 映射到数据库的变量是$lastRun ,但是您的设置正在执行$this->lastrun;

Since variable names are case-sensitive in PHP, you were simply creating a new public class variable, but that wasn't being mapped to the database. 由于变量名称在PHP中区分大小写,因此您只是在创建一个新的公共类变量,但是没有将其映射到数据库。 If you were using PHP's strict mode for errors it would have caught this and thrown an error. 如果您使用PHP的严格模式来处理错误,则可能会捕获此错误并抛出错误。

Here's the updated code: 这是更新的代码:

public function setLastRun(\\DateTime $lastRun = null) { $this->lastRun = $lastRun; 公共函数setLastRun(\\ DateTime $ lastRun = null){$ this-> lastRun = $ lastRun; } }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM