(Symfony项目)原则错误:通过关系找到了新实体,在运行messageBus时发生,(同步工作正常)

pgccezyw  于 2023-11-22  发布在  其他
关注(0)|答案(1)|浏览(147)

我知道很多人问这种类型的问题,但我相信我是不同的,因为我只encouter错误时,试图运行的消息cnc。
这只是一个个人使用的项目,试图实现strava高级功能我自己(我让它工作,但我只是想更好地处理一切)。我是新的symfony,所以我希望我提出的问题和问题明确的人给给予我一些提示。
在我的控制器中,我调用函数来开始从strava API加载活动,然后进行一些计算来持久化新的活动并刷新它们。
我只遇到这个错误时,运行的消息c.如果im同步运行它的工作完全正常.我希望能够运行它c,因为这使得用户体验更好的方式,如果我可以做其他事情,而功能在后台运行.
在我的控制器中,我像这样调用开始加载:

$user = $this->getUser();
$messageBus->dispatch(new StartLoadingMessage($user));

字符串
StartLoadingMessage类只是标准消息类
StartLoadingMessageLog类是这样的:

class StartLoadingMessageHandler implements MessageHandlerInterface
{
    public function __construct(private StravaRequests $startLoading)
    {
        $this->startLoading = $startLoading;
    }

    public function __invoke(StartLoadingMessage $message)
    {
        // Run the background task here
        $user = $message->getUser();
        $this->startLoading->startLoading($user);
    }
}


然后在实际的startloading函数中,我进行了一些API调用(没有错误)和一些计算,然后我尝试将新创建的Activity添加到数据库中,如下所示:

$newActivity = new Activity();
            $newActivity->setUser($user);
           
            $newActivity->setStravaId($activity['id']);
            $newActivity->setType($activity['type']);
            $newActivity->setRecordData($peaks);
            $this->em->persist($newActivity);
            $this->em->flush();

EDIT在此之后,我也更新用户如下:

if (count($activities) > 0) {
            $latestEpochBeforeDate = 
          strtotime($activities[count($activities) - 1]['start_date']);
            $user->setLatestLoadedEpochDate($latestEpochBeforeDate);
            
            $this->em->flush();
        }


我不知道这是否是正确的方式即时通讯你需要创建一个新的实体(活动在我的情况下)和更新其他(用户)
在Activity实体中,我确保添加了cascade persist行:

#[ORM\ManyToOne(inversedBy: 'activities', cascade:['persist'])]
    #[ORM\JoinColumn(nullable: false)]
    private ?User $user = null;


我试图在startloading函数中显式地调用用户实体上的automityManager #persist(),但这也不起作用。

pengsaosao

pengsaosao1#

我猜问题来自于你的User实体,当它在Doctrine中运行时,它当前与Doctrine作用域分离。纠正它的方法是使用下面的代码,如果你的Doctrine版本接受它:

$newActivity = new Activity();
$newActivity->setUser($user);
           
$newActivity->setStravaId($activity['id']);
$newActivity->setType($activity['type']);
$newActivity->setRecordData($peaks);

$this->em->merge($user);
$this->em->persist($newActivity);
$this->em->flush();

字符串
或者简单地使用UserRepository和用户ID查询User,并替换实际的$user变量。

相关问题