diff --git a/src/Model/Entity/User.php b/src/Model/Entity/User.php index e996e99..aa01c56 100644 --- a/src/Model/Entity/User.php +++ b/src/Model/Entity/User.php @@ -27,6 +27,15 @@ class User extends Entity { use LocatorAwareTrait; + /** + * Cached per-request statistics. + * + * @var array + */ + protected array $statsCache = [ + 'potato_sent_today' => null, + ]; + /** * Fields that can be mass assigned using newEntity() or patchEntity(). * @@ -121,6 +130,10 @@ public function potatoReceived(): int */ public function potatoSentToday(): int { + if ($this->statsCache['potato_sent_today'] !== null) { + return (int)$this->statsCache['potato_sent_today']; + } + $messagesTable = $this->fetchTable('Messages'); $query = $messagesTable->find(); @@ -135,7 +148,10 @@ public function potatoSentToday(): int ]) ->first(); - return (int)$result->sent; + $sentToday = (int)($result->sent ?? 0); + $this->statsCache['potato_sent_today'] = $sentToday; + + return $sentToday; } /** @@ -165,21 +181,9 @@ public function potatoReceivedToday(): int */ public function potatoLeftToday(): int { - $messagesTable = $this->fetchTable('Messages'); - - $query = $messagesTable->find(); - $result = $query - ->select([ - 'sent' => $query->func()->sum('amount'), - ]) - ->where([ - 'sender_user_id' => $this->id, - 'type' => Message::TYPE_POTATO, - 'created >=' => $this->getStartOfDay(), - ]) - ->first(); + $sentToday = $this->potatoSentToday(); - return Message::MAX_AMOUNT - (int)$result->sent; + return Message::MAX_AMOUNT - $sentToday; } /**