Orm 交易表中的用户余额

Orm 交易表中的用户余额,orm,doctrine-orm,zend-framework2,doctrine,Orm,Doctrine Orm,Zend Framework2,Doctrine,我很想知道在事务表中监视用户余额的最佳方法,其中事务是存款或取款 我目前的表格结构是: private $id; private $user; private $type; //credit or debit private $identity; //deposit, transfer, withdraw private $amount; private $description; private $scoredFee; //fixed charge private $commission; /

我很想知道在事务表中监视用户余额的最佳方法,其中事务是存款或取款

我目前的表格结构是:

private $id;
private $user;
private $type; //credit or debit
private $identity; //deposit, transfer, withdraw
private $amount;
private $description;
private $scoredFee; //fixed charge
private $commission; //% charge
private $method; //cc, wallet etc.
private $status;
要计算用户余额,我只需计算所有贷项的总和,然后减去所有借项的总和:

public function getUserBalance(User $userObject)
{
    $credits = $this->transactionRepository->createQueryBuilder('u')
        ->add('select','SUM(u.amount)')
        ->where('u.status = :status')
        ->andWhere('u.type = :type')
        ->andWhere('u.user = :userObject')
        ->setParameter('status' , 1)
        ->setParameter('type' , 1)
        ->setParameter('userObject' , $userObject)
        ->getQuery()
        ->getSingleScalarResult();

    $debits = $this->transactionRepository->createQueryBuilder('u')
        ->add('select','SUM(u.amount)')
        ->where('u.status = :status')
        ->andWhere('u.user = :userObject')
        ->andWhere('u.type = :type')
        ->setParameter('status' , 1)
        ->setParameter('userObject' , $userObject)
        ->setParameter('type' , 2)
        ->getQuery()
        ->getSingleScalarResult();

    $balance = $credits - $debits;

    if (null == $balance)
    {
        return 0;
    }

    return $balance;

}
我考虑的另一种方法是在users表中有一个固定帐户余额,它是在用户每次进行交易时计算出来的。我唯一的保留是边缘案例与此不同步


有更好的方法吗?

您可以通过解码金额(我想是求和还是减法)在中只简化一个查询,如下所示:

public function getUserBalance(User $userObject)
{
    $qb = $this->transactionRepository->createQueryBuilder('u');

    $qb ->add('select','SUM(CASE WHEN u.type = 1 then u.amount ELSE -u.amount END)')
        ->where('u.status = :status')
        ->andWhere($qb->expr()->in('u.type', array(1,2)))
        ->andWhere('u.user = :userObject')
        ->setParameter('status' , 1)
        ->setParameter('userObject' , $userObject);

    $balance = $qb
        ->getQuery()
        ->getSingleScalarResult();

    return $balance;

}

希望这有助于

非常好的建议!非常感谢。你会说,在每次通话中从交易表中计算余额而不是在用户表中有一个固定的金额是很好的吗?您好@HappyCoder欢迎!取决于许多因素,比如需要显示相关信息的次数、用户可以进行多少交易等。通常,用户表上的存档余额会有很大帮助!记住更新托管事务的同一事务中的值,并定期检查事务总和和用户余额字段之间的禁用情况。