【发布时间】:2013-12-20 17:16:13
【问题描述】:
当我在处理我的 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),我得到了正确的日期......
有没有人已经遇到过这个问题或知道如何解决这个问题?
再次感谢您。如果您需要更多信息,请询问,我会尽我所能提供帮助。
编辑:存储在aproducts 中的其他aproduct 正在显示正确的日期...
【问题讨论】:
-
您是否使用此处建议的自定义日期时间类型? docs.doctrine-project.org/en/2.0.x/cookbook/…
-
@YRM 为什么时区会影响 DateTime 整个月?
-
我会打印调试 Doctrine\DBAL\Types\DateTimeType::convertToPHPValue() 中发生的情况,问题可能出在您自己的代码中。
-
@sjagr 不会,我只是问他是否使用自定义日期时间,因为那时我们需要看到它..
-
@YRM 不,我没有在这里使用自定义日期时间。但我想知道和sjagr一样的事情。你的演讲很有趣。
标签: php database datetime symfony doctrine-orm