交易表中的用户余额

Posted

技术标签:

【中文标题】交易表中的用户余额【英文标题】:User balance from a transaction table 【发布时间】:2015-08-04 13:29:25 【问题描述】:

我很想知道在交易表中监控用户余额的最佳方式,其中交易是存款或取款。

我目前的表结构是:

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;


我考虑的另一种方法是在用户表中设置一个固定的帐户余额,每次用户进行交易时都会计算出来。我唯一的保留是与此不同步的边缘情况。

有更好的方法吗?

【问题讨论】:

【参考方案1】:

您可以通过解码金额(我想是加法或减法)来简化仅一个查询,如下所示:

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,不客气!取决于许多因素,您需要显示多少次相关信息,用户可以进行多少次交易等。通常,用户表上的归档余额有很大帮助!请记住更新托管交易的同一交易中的值,并定期检查交易总和与用户余额字段之间的不一致。

以上是关于交易表中的用户余额的主要内容,如果未能解决你的问题,请参考以下文章

余额为负3个月

如何在 Google Cloud Datastore 上更新交易中的帐户余额

网上银行安全体系

网上银行安全体系

SQL 从多行的另一张表的余额中扣除一个表中的值

MySQL - 加入 2 个表