php 如何通过两个字段更新实体?

ht4b089n  于 2023-06-28  发布在  PHP
关注(0)|答案(1)|浏览(88)

也许有人知道。我想使用citusdb并尝试重写教义更新。如果我对实体使用标准更新例如

$order = $repository->find(1);
$human->setComment("test");
$entityManager->flush();

此代码创建查询Updates订单SET评论= "test" WHERE id = 1;
citusdb中的分片我选择了used_id字段。此字段存在于所有表中。
我需要接收Updates订单SET评论= "test" WHERE id = 1 and user_id = 5;
我试着加上

$order = $repository->find(1);
$human->setComment("test");
$human->setUserId(5);
$entityManager->flush();

但是如果user_id不改变原则,则从sql中删除此字段。
我在教义中读到了preUpdate,prePost事件,也许这可以帮助解决我的任务。但是我不知道如何=(

toiithl6

toiithl61#

在使用Doctrine和CitusDB进行基于user_id字段的分片时,要实现在更新查询中包含user_id字段的任务,可以利用Doctrine的事件和生命周期回调。
下面是一个如何实现它的示例:
创建一个Doctrine事件订阅者类来监听preUpdate事件:

use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Events;
use Doctrine\Persistence\Event\LifecycleEventArgs;

class ShardingEventSubscriber implements EventSubscriber
{
    public function getSubscribedEvents()
    {
        return [
            Events::preUpdate,
        ];
    }

    public function preUpdate(LifecycleEventArgs $args)
    {
        $entity = $args->getObject();

        if ($entity instanceof YourEntityClass) {
            $entityManager = $args->getObjectManager();
            $unitOfWork = $entityManager->getUnitOfWork();

            // Check if the `user_id` field has been changed
            if ($unitOfWork->isScheduledForUpdate($entity)) {
                $changeset = $unitOfWork->getEntityChangeSet($entity);

                if (isset($changeset['user_id'])) {
                    $unitOfWork->propertyChanged($entity, 'user_id', $entity->getUserId(), $changeset['user_id'][0]);
                }
            }
        }
    }
}

$eventManager = $entityManager->getEventManager();
$eventManager->addEventSubscriber(new ShardingEventSubscriber());

现在,当你更新你的实体时,你可以设置user_id字段,Doctrine会把它包含在更新查询中,即使值保持不变。

$order = $repository->find(1);
$order->setComment("test");
$order->setUserId(5);
$entityManager->flush();

相关问题