gpt4 book ai didi

datetime - Doctrine 类表继承属性在查询时具有错误值

转载 作者:行者123 更新时间:2023-12-02 21:39:56 24 4
gpt4 key购买 nike

我在模型中使用了两个 Doctrine 概念:

  • 类表继承
  • 生命周期回调

当我加载父类的继承实例时,使用生命周期回调更新的父属性是错误的,不是我数据库的父类表中的值。

父{abstract}类:User

use DateTime;

/**
* User
*
* @ORM\Table(name="users")
* @ORM\Entity(repositoryClass="MyProject\CoreBundle\Repository\UserRepository")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="entity_name", type="string")
* @ORM\DiscriminatorMap({"member" = "Member", "administrator" = "Administrator"})
* @ORM\HasLifecycleCallbacks()
*/
abstract class User implements AdvancedUserInterface, Serializable
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;

/**
* @var DateTime
*
* @ORM\Column(name="created_at", type="datetime")
*/
protected $createdAt;

/**
* @var DateTime
*
* @ORM\Column(name="updated_at", type="datetime")
*/
protected $updatedAt;

// ...

public function __construct()
{
$this->createdAt = new DateTime();
$this->updatedAt = new DateTime();
// ...

return $this;
}

/**
* @ORM\PreUpdate
*/
public function onPreUpdate()
{
$this->updatedAt = new DateTime();
}
}

子级:成员(member)

/**
* Member
*
* @ORM\Table(name="members")
* @ORM\Entity(repositoryClass="MyProject\CoreBundle\Repository\MemberRepository")
* @ORM\HasLifecycleCallbacks()
*/
class Member extends User
{
// ...

public function __construct()
{
parent::__construct();

// ...

return $this;
}
}

然后在 Controller 中

use MyProject\CoreBundle\Entity\Member;

public function someAction(Member $member)
{
$em = $this->getDoctrine()->getManager();
$member = $em->getRepository(Member::class)->find(1);

exit(var_dump($member->getUpdatedAt()));
// --> date of today, why?
}

这是我的数据库内容的摘录

// users
|----|---------------------|---------------------|-------------|
| id | created_at | updated_at | entity_name |
|----|---------------------|---------------------|-------------|
| 1 | 2016-01-01 00:00:00 | 2016-06-01 12:00:00 | member |
|----|---------------------|---------------------|-------------|

// members
|----|
| id |
|----|
| 1 |
|----|

当我调试成员的 UpdatedAt 属性时,我希望该值是与 2016-06-01 12:00:00 对应的 DateTime 对象,而不是当天的日期。 .

它甚至与继承加载有关吗?无法弄清楚它是从哪里来的。

最佳答案

您的updatedAt可能来自User类。在 User 类的 __construct() 中,使用 $this->createdAt = new DateTime()$ 填充数据this->updatedAt = new DateTime()。我认为这是一个不好的做法,因为 createdAt 应该在 User 创建时填充,而 updatedAtUser 上填充创建或更新。尝试将您的 User 类更新为此(删除 __constructor):

use DateTime;

/**
* User
*
* @ORM\Table(name="users")
* @ORM\Entity(repositoryClass="MyProject\CoreBundle\Repository\UserRepository")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="entity_name", type="string")
* @ORM\DiscriminatorMap({"member" = "Member", "administrator" = "Administrator"})
* @ORM\HasLifecycleCallbacks()
*/
abstract class User implements AdvancedUserInterface, Serializable
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;

/**
* @var DateTime
*
* @ORM\Column(name="created_at", type="datetime")
*/
protected $createdAt;

/**
* @var DateTime
*
* @ORM\Column(name="updated_at", type="datetime")
*/
protected $updatedAt;

// ...

/**
* @ORM\PrePersist
*/
public function onPrePersist()
{
$this->createdAt = new DateTime();
$this->updatedAt = new DateTime();
}

/**
* @ORM\PreUpdate
*/
public function onPreUpdate()
{
$this->updatedAt = new DateTime();
}
}

关于datetime - Doctrine 类表继承属性在查询时具有错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41618193/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com