Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2-更新一对一关系中的实体_Php_Entity Framework_Symfony_Orm - Fatal编程技术网

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

Php Symfony2-更新一对一关系中的实体,php,entity-framework,symfony,orm,Php,Entity Framework,Symfony,Orm,我正在尝试更新我的SingleTask实体,但不接受任何更改。我的事件和SingleTask之间的关系是双向的一对一关系 我的活动实体的相关部分包括: class Event { // properties /** * @OneToOne(targetEntity="SingleTask", mappedBy="event", cascade={"persist", "remove"}) */ private $singletask; public f

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

我的活动实体的相关部分包括:

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;
   }
}
我的SingleTask实体的相关部分包括:

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();
   }
}
不幸的是,SingleTask的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();

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

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

我希望这能解决你的问题

从注释中可以看出,这是$lastRun变量的一个简单输入错误。映射到数据库的变量是$lastRun,但您的设置是$this->lastRun

因为变量名在PHP中是区分大小写的,所以您只是创建了一个新的公共类变量,但它没有映射到数据库。如果您使用PHP的strict模式处理错误,它会捕获并抛出一个错误

以下是更新的代码:

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

不幸的是,这没有完成。您有输出吗?如果您已经有singletask对象,为什么还要再次获取它?@JasonRoman观察得很好。我已经删除了SingleTask对象的冗余抓取,并更新了上面问题中的代码。结果仍然没有变化,这是SingleTask数据库行没有变化。您可以发布更多关于如何创建事件的代码吗?如果事件已经存在,则无需再次调用persist,只需刷新即可。另外,您不需要说->setSingleTask,因为您已经从$event中获取了它。@JasonRoman我已经更新了命令文件代码,以显示如何从事件存储库中检索所有现有的事件对象。我还删除了persist调用,结果是一样的。根据我的理解,从事件对象检索SingleTask,更新其信息并将其设置回事件对象,然后刷新实体管理器就足够了…一条注释-您可以跳过$Event->setSingleTask$SingleTask;在您的循环中,因为它已经连接到事件,您可以移动$this->em->flush;在foreach之外-它将在最后处理所有更新,而不是通过每个循环迭代。但我不得不问一个显而易见的问题。查看您的数据库…您确定这些事件有一个与之关联的任务实体吗?看起来您没有在单个任务上设置事件-检查数据库中的那些任务,看看event_id是否为null,我在这里也不允许null。