PHP/Doctrine-在for()循环外使用flush()保存日期时间

PHP/Doctrine-在for()循环外使用flush()保存日期时间,php,datetime,doctrine,Php,Datetime,Doctrine,在循环中记录三个具有日期时间属性的实体时,我遇到了一个小问题 以下是我使用的代码: $today = new DateTime(); $frequency = 3; for($i=1;$i<=3;$i++) { $interval = DateInterval::createFromDateString("+".($i * $frequency)." days"); $reminder = new Reminder(); $reminder->setNumb

在循环中记录三个具有日期时间属性的实体时,我遇到了一个小问题

以下是我使用的代码:

$today = new DateTime();
$frequency = 3;

for($i=1;$i<=3;$i++) {
    $interval = DateInterval::createFromDateString("+".($i * $frequency)." days");
    $reminder = new Reminder();
    $reminder->setNumber($i);            
    $reminder->setScheduledAt($today->add($interval));            
    $this->em->persist($reminder);            
}
$this->em->flush();
所有三个日期都记录正确(即
datediff
等于
3,6
和从今天开始的9天) 在我看来,
flush()
应该留在循环之外。。。我错过了什么

这是我的实体:

/**
 * @ORM\Column(type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @ORM\Column(type="integer",length=1)
 */
private $number;

/**
 * @ORM\Column(type="datetime",nullable=true)
 */
private $scheduledAt;

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\WorkFlowStep" , fetch="EAGER")
 * @ORM\JoinColumn(referencedColumnName="id")
 */
private $step ;

感谢您抽出时间。

这是因为您正在修改循环中的
DateTime
对象。 当
flush
循环之外时
scheduleAt
属性设置为具有9天提醒的同一对象。您应该创建三个不同的
DateTime
对象,例如克隆:

$today->add($interval);
$scheduledAt = clone $today;
$reminder->setScheduledAt($scheduleAt);

// flush outside the loop
在这种情况下,实体具有设置了3个不同日期的
scheduledAt
属性

当循环中有
flush
时(不推荐),您将每隔3天保存到
DB
cureent
DateTime
对象状态

注意


最简单的解决方案是使用
\DateTimeImmutable
。在这种情况下,无论何时调用:
modify
方法,您都会收到新的
\DateTimeImmutable
对象-不需要克隆,您可以在循环中调用:
modify

的确,谢谢您,它工作得非常好!祝你今天愉快:)好的,你能接受我的回答并投票表决吗?我可以投票,但现在还看不到。。。再次感谢你
$today->add($interval);
$scheduledAt = clone $today;
$reminder->setScheduledAt($scheduleAt);

// flush outside the loop