当我在进行Symfony2项目时,再次出现了一个奇怪的错误。
我创建了一个Check
包含一个dateCreated
属性和其他一些属性的Check
实体,因此可以链接到扩展了的不同实体ProductBase
。以下是Check
和的示例AProduct
:
/**
* Check
*
* @ORM\Table(name="check")
* @ORM\Entity
*/
class Check
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var \DateTime
*
* @ORM\Column(name="date_created", type="datetime")
*/
private $dateCreated;
[...]
/**
* @ORM\ManyToOne(targetEntity="Acme\BlogBundle\Entity\AProduct", inversedBy="checks")
* @ORM\JoinColumn(name="aproduct_id", referencedColumnName="id", onDelete="CASCADE")
*/
protected $aproduct;
[...]
}
/**
* AProduct
*
* @ORM\Table(name="aproduct")
* @ORM\Entity
*/
class AProduct extends ProductBase
{
[...]
/**
* @ORM\OneToMany(targetEntity="Acme\BlogBundle\Entity\Check", mappedBy="product")
* @ORM\OrderBy({"dateCreated" = "DESC"})
*/
protected $checks;
[...]
}
所以我的问题是,当我试图在我的dateCreated
一个控制器中显示该属性时,请参见下面的代码,Symfony2(或Doctrine2)正向数据库中存储的日期添加一个月,而我不知道为什么会这样:
[...]
$aproduct = $aproducts[0];
$checks = $aproduct->getChecks();
$lastCheck = $checks->toArray()[0]; //I know it's not 'safe' but it's shorter to expose my problem
var_dump($lastCheck->getDateCreated());
结果:
object(DateTime)[854]
public 'date' => string '2014-01-20 16:21:41' (length=19)
public 'timezone_type' => int 3
public 'timezone' => string 'UTC' (length=3)
存储在数据库中的值:
2013-12-20 16:21:41
我最不明白的是,在另一个控制器中,使用完全相同的方法,但在不同的产品(BProduct
例如)上,我得到了正确的日期……是否有人已经面临这个问题或对什么有任何线索要解决吗?
再次感谢你。如果您需要更多信息,请询问,我将尽最大努力为您提供帮助。
编辑:aproduct
存储在其他人aproducts
显示正确的日期...
好吧,我终于找到了问题,我在这里的帖子真的很愚蠢,与Symfony或Doctrine完全无关,对此感到抱歉。aproduct
在显示支票的最后一个实例时,我正在执行一些“测试”,而这些“测试”正在影响dateCreated
价值。这是我在做什么:
public static function updateAProductStatus(AProduct $product){
if(($check = $product->getChecks()->first()) instanceof Check){
$date = $check->getDateCreated();
$expiracyDate = $date->add(new \DateInterval('P1M')); //this line is the problem
$status = self::getStatus($expiracyDate); //this is only returning 'expired', 'expiring' or 'good' based on the difference between today's date and dateCreated + 1 month
} else {
$status = 'expired';
}
return $status;
}
因此,作为写入代码,$date->add(new \DateInterval('P1M'));
正在改变的存储值Checks
的dateCreated
属性。我不明白为什么会影响它,因为我没有直接在Check
实例上工作。
解决它的快速方法是DateTime
在添加之前显式克隆实例DateInterval
:
$date = clone $date;
但是我将在我Check
或AProduct
实体中添加一个新字段来存储到期日期,而不是在每次更新时都对其进行计算。
更新:
我读到PHP将对象和数组作为引用而不是值传递。这就是为什么我在这里遇到问题。我不知道PHP就是那样。以后我会更加小心!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句