dppfxf909679 2015-01-01 22:52
浏览 62
已采纳

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

I am trying to update my SingleTask entity however no change is accepted. The relationship between my Event and SingleTask is a bi-directional one-to-one relationship.

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:

/**
 * @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. 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();
  • 写回答

2条回答 默认 最新

  • dongyang7152 2015-01-04 02:49
    关注

    From the comments - it turns out this was a simple typo of the $lastRun variable. The variable mapped to the database is $lastRun, but your setting is doing $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. If you were using PHP's strict mode for errors it would have caught this and thrown an error.

    Here's the updated code:

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?