Php Symfony2-更新一对一关系中的实体
我正在尝试更新我的SingleTask实体,但不接受任何更改。我的事件和SingleTask之间的关系是双向的一对一关系 我的活动实体的相关部分包括: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
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。