gpt4 book ai didi

php - 如何使用带有学说的事件监听器更改相关实体

转载 作者:搜寻专家 更新时间:2023-10-31 21:28:16 25 4
gpt4 key购买 nike

使用 Symfony 和 Doctrine,我有一个 User 实体和一个 Address 实体。每个用户可以有 0 个或多个地址,其中一个是他的默认地址。

因此,当我将默认地址从一个更改为另一个时,我应该将那个设置为默认地址,而将其他地址设置为非默认地址( bool 字段)。

我尝试使用事件监听器这样做,所以当 Address 实体更新时,我启动了更新后的事件,将所有其他地址设置为非默认地址,如下所示:

class AddresssListener
{
public function postUpdate(LifecycleEventArgs $event)
{
$entity = $event->getEntity();
if ($entity instanceof Address) {
$this->changeDefaultAddress($entity, $event);
}
}

private function changeDefaultAddress($address, $event)
{
if ($address->getIsDefault() == true) {
foreach ($address->getUser()->getBillingDatas() as $another_address) {
if ($address != $another_address) {
$another_address->setIsDefault(false);
$em = $event->getEntityManager();
$em->persist($another_address);
}
}
}
}
}

代码执行正确,没有报错,但是对非默认地址的修改没有保存。

最佳答案

如果一个 User 只能有一个默认的 Address,您还应该以某种方式确保您的数据库模型只支持一个地址作为默认地址。

我建议将当前默认地址 Address 设为 User 的关系(Address< 之间的附加一对一关联($defaultAddress)和 User 与地址的一对多关系)。然后你可以简单地这样做:

$user->setDefaultAddress($address);
$em->persist($user);
$em->flush();

这可以通过一个数据库操作完成,而在您的示例中有两个(在第一个操作刷新后调用 PostPersist)

现在很容易得到当前的默认地址:

$address = $user->getDefaultAddress();

关于php - 如何使用带有学说的事件监听器更改相关实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33147039/

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