一笔交易的用户余额 table
User balance from a transaction table
我很想知道在交易 table 中监控用户余额的最佳方式,其中交易是存款或取款。
我当前的table结构是:
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;
}
我考虑的另一种方法是在用户中有一个固定的账户余额table,这是在用户每次进行交易时计算出来的。我唯一的保留是边缘情况与此不同步。
有没有更好的方法?
你可以在只有一个查询中使用金额的解码(我想是加法或减法)来简化,如下所示:
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;
}
希望对您有所帮助
我很想知道在交易 table 中监控用户余额的最佳方式,其中交易是存款或取款。
我当前的table结构是:
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;
}
我考虑的另一种方法是在用户中有一个固定的账户余额table,这是在用户每次进行交易时计算出来的。我唯一的保留是边缘情况与此不同步。
有没有更好的方法?
你可以在只有一个查询中使用金额的解码(我想是加法或减法)来简化,如下所示:
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;
}
希望对您有所帮助