gpt4 book ai didi

symfony - Doctrine - 在 onFlush 事件监听器中获取旧值

转载 作者:行者123 更新时间:2023-12-02 10:34:46 26 4
gpt4 key购买 nike

我正在尝试实现一项功能,让用户指定其相互状态并选择另一个用户,就像 Facebook 中的用户一样。

我的数据库架构如下:

UserInfo 实体:

class UserInfo
{

/**
* @ORM\OneToOne(targetEntity="User", inversedBy="user_info")
*/
protected $user;

/**
* @ORM\Column(type="text", nullable=true)
* @Assert\NotBlank
*/
protected $status; //Value taken from a dropdown list

/**
* @ORM\OneToOne(targetEntity="User", inversedBy="relationship_with_table")
*/
protected $relationship_user;
}

用户实体:

class User
{

/**
* @ORM\OneToOne(targetEntity="UserInfo", mappedBy ="user", cascade={"persist","remove"})
*/
protected $user_info;

/**
* @ORM\OneToOne(targetEntity="UserInfo", mappedBy="relationship_user")
*/
protected $relationship_with_table;
}

用户信息类型:

class UserInfoType extends AbstractType
{

public function buildForm(FormBuilderInterface $builder, array $option)
{
$builder
->add("birthday", "birthday")
->add("gender", "choice", array("choices" => array("0" => "Male", "1" => "Female")))
->add("status", "choice", array("choices" => array(
"Single" => "Single",
"In relationship" => "In relationship",
"Engaged" => "Engaged",
"Married" => "Married"
)))
->add("relationship_user", "thrace_select2_entity", array(
"class" => 'Zgh\FEBundle\Entity\User',
'label' => 'User',
'empty_value' => 'Select user',
"configs" => array(
"width" => '100%',
),
))
->add("city", "text")
->add("work", "text")
->add("facebook", "url")
->add("twitter", "url")
;
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
"data_class" => 'Zgh\FEBundle\Entity\UserInfo',
"cascade_validation" => true,
));
}

public function getName()
{
return "user_info";
}
}

现在这是事件监听器,它检查用户状态并更改其他用户状态,它按预期工作。但只有一个缺陷,如果用户与(A)结婚,然后将其更改为与(B)结婚,则用户(A)仍然获得已婚并且不会重置。

我想做的就是在将用户关系附加到(B)之前,我想检索(A)并重置它。如何在 onFlush 事件中完成此操作。

class DoctrinePreUpdateHandler implements EventSubscriber
{
public function getSubscribedEvents()
{
return array(
"onFlush",
);
}

public function onFlush(OnFlushEventArgs $args)
{
$em = $args->getEntityManager();
$uow = $em->getUnitOfWork();

$updates = $uow->getScheduledEntityUpdates();

foreach ($updates as $entity) {

if($entity instanceof UserInfo){

$target_user_info = null;

if($entity->getStatus() == "Single"){
if($entity->getRelationshipUser() != null){
$target_user_info = $entity->getRelationshipUser()->getUserInfo();
$target_user_info->setStatus("Single");
$target_user_info->setRelationshipUser(null);
}
$entity->setRelationshipUser(null);
} else {
$target_user_info = $entity->getRelationshipUser()->getUserInfo();
$target_user_info->setStatus($entity->getStatus());
$target_user_info->setRelationshipUser($entity->getUser());
}

if($target_user_info != null){
$em->persist($target_user_info);
$uow->computeChangeSet($em->getClassMetadata(get_class($target_user_info)), $target_user_info);
}
}
}
}
}

最佳答案

Doctrine UoW 有一个方法 propertyChanged(...) 来跟踪实体属性的更改。这些更改存储在UoW的entityChangeSets-Property中。

我认为应该可以调用 $uow->getEntityChangeSet($entity) 它返回一个数组,其中键是 $entity 的属性,值为 [$oldValue, $newValue] .

我不确定您是否必须为旧关系用户调用 computeChangeSet(),但我希望您能弄清楚这一点并发表评论?

关于symfony - Doctrine - 在 onFlush 事件监听器中获取旧值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23605018/

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