我有一个正在运行的 PHP 程序,用于处理耗材库存。
我希望此代码在打开页面时能够更快地处理以更新耗材余额。
SUPPLIES 包含供应品的库存及其余额。
TRANSACTIONS包含接收、返回和发出的交易。
下面的程序检索表的 SUPPLIES 和 TRANSACTIONS,并计算所有 TRANSACTIONS 的余额,从而更新 SUPPLIES 的 MYSQL 表。
<?php
//Update supplies balance starts here
$supplies = DB::getInstance()->query("SELECT * FROM supplies ORDER BY id DESC");
foreach($supplies->results() as $supply) {
$balance = 0;
$transactions = DB::getInstance()->query("SELECT * FROM transactions ORDER BY id ASC");
foreach($transactions->results() as $transaction) {
if($transaction->code === $supply->id){
if($transaction->transaction_type === "1"){
$balance = $balance + $transaction->quantity;
} else if($transaction->transaction_type === "2"){
$balance = $balance - $transaction->quantity;
} else if($transaction->transaction_type === "3"){
$balance = $balance + $transaction->quantity;
}
}
}
$supplied = new Supply();
$supplied->find($supply->id);
try {
$supplied->update(array(
'balance' => $balance,
));
} catch (Exception $e) {
die($e->getMessage());
}
}
//Update supplies balance ends here
?>
最佳答案
正如@Phylogenesis所说,交易中的变化应该触发供应品的更新。
BEGIN TRANSACTION;
UPDATE transactions SET quantity = ..., code = ..., ....;
UPDATE supplies SET balance = balance +/- ....;
COMMIT;
因此,您不需要每次打开页面时都更新资源,也不需要重新计算整个表格。在一笔交易中完成此操作非常重要。理想情况下,如果可能的话,应该将其放置在事务表功能“TRIGGER ON UPDATE”中的数据库中。
如果不能,请尝试在数据库端计算供应的更新值,例如:
UPDATE supplies s
SET balance =
(SELECT SUM(quantity) FROM transactions t WHERE t.code = s.id AND transaction_type IN (1, 3)) -
(SELECT SUM(quantity) FROM transactions t WHERE t.code = s.id AND transaction_type = 2);
它仍然比 PHP 慢,但快得多。
已编辑:我更新了查询示例以满足问题。
关于PHP 代码处理速度更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45607326/