Doctrine更新实体循环,持久还是刷新?

Clé*_*aud 6 symfony doctrine-orm

我有多个循环,如:

    $bets = $this->em->getRepository('AppBundle:Bet')->getBetsForMatch($match_id);

    foreach ($bets as $key => $bet) {
        $devices = $this->em->getRepository('AppBundle:Device')->findBy(array('user' => $bets->getUser()));

        foreach ($devices as $key => $device) {
            //HERE I SEND A PUSH NOTIFICATION

            if($this->rms_push->send($message)){
                $device->getUser()->setBadge($device->getUser()->getBadge() + 1);
                $this->em->flush();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

所以,我得到了一场比赛的所有赌注,因为每次下注我都会为用户保存所有设备,之后我需要更新我的用户: $device->getUser()->setBadge($device->getUser()->getBadge() + 1);

现在,我每次冲洗,但我认为有更好的方法,想法?

cha*_*asr 7

你的循环中只需要一次冲洗:

foreach ($bets as $key => $bet) {
    $devices = $this->em->getRepository('AppBundle:Device')->findBy(array('user' => $bets->getUser()));

    foreach ($devices as $key => $device) {
        //HERE I SEND A PUSH NOTIFICATION

        if($this->rms_push->send($message)){
            $device->getUser()->setBadge($device->getUser()->getBadge() + 1);
        }
    }
}

$this->em->flush();
Run Code Online (Sandbox Code Playgroud)

调用$this->_em->persist($obj)涉及创建新条目.

如果您需要创建或根据条目更新存在与否,看EntityManager::merge.

要保留大量条目的内存使用量,请查看批处理.

注意如果代码EntityManager::flush在循环内部调用,SensioLabs洞察(PHP源代码质量分析)会发出警告.