|
7 | 7 | use wcf\data\user\notification\UserNotificationList; |
8 | 8 | use wcf\data\user\User; |
9 | 9 | use wcf\data\user\UserProfile; |
| 10 | +use wcf\system\database\util\PreparedStatementConditionBuilder; |
10 | 11 | use wcf\system\WCF; |
11 | 12 |
|
12 | 13 | /** |
@@ -90,33 +91,38 @@ private function createUserNotifications(UserProfile $author, array $notificatio |
90 | 91 | (notificationID, authorID, time) |
91 | 92 | VALUES (?, ?, ?)"; |
92 | 93 | $authorStatement = WCF::getDB()->prepare($sql); |
93 | | - $sql = "UPDATE wcf1_user_notification |
94 | | - SET timesTriggered = timesTriggered + ?, |
95 | | - guestTimesTriggered = guestTimesTriggered + ? |
96 | | - WHERE notificationID = ?"; |
97 | | - $triggerStatement = WCF::getDB()->prepare($sql); |
98 | 94 |
|
99 | 95 | $authorId = $author->userID; |
100 | 96 | $isGuestTrigger = $authorId ? 0 : 1; |
101 | 97 | $now = TIME_NOW; |
102 | | - $notificationIDs = []; |
| 98 | + $notificationIDs = \array_map(static function ($notificationData) { |
| 99 | + return $notificationData['object']->notificationID; |
| 100 | + }, $notifications); |
103 | 101 |
|
104 | 102 | WCF::getDB()->beginTransaction(); |
105 | | - foreach ($notifications as $notificationData) { |
106 | | - $notificationID = $notificationData['object']->notificationID; |
107 | | - $notificationIDs[] = $notificationID; |
108 | | - |
| 103 | + foreach ($notificationIDs as $notificationID) { |
109 | 104 | $authorStatement->execute([ |
110 | 105 | $notificationID, |
111 | 106 | $authorId, |
112 | 107 | $now, |
113 | 108 | ]); |
| 109 | + } |
| 110 | + |
| 111 | + $chunks = \array_chunk($notificationIDs, 1_000); |
| 112 | + foreach ($chunks as $chunk) { |
| 113 | + $conditionBuilder = new PreparedStatementConditionBuilder(); |
| 114 | + $conditionBuilder->add('notificationID IN (?)', [$chunk]); |
114 | 115 |
|
115 | | - $triggerStatement->execute([ |
| 116 | + $sql = "UPDATE wcf1_user_notification |
| 117 | + SET timesTriggered = timesTriggered + ?, |
| 118 | + guestTimesTriggered = guestTimesTriggered + ? |
| 119 | + " . $conditionBuilder; |
| 120 | + $triggerStatement = WCF::getDB()->prepare($sql); |
| 121 | + |
| 122 | + $triggerStatement->execute(\array_merge([ |
116 | 123 | 1, |
117 | 124 | $isGuestTrigger, |
118 | | - $notificationID, |
119 | | - ]); |
| 125 | + ], $conditionBuilder->getParameters())); |
120 | 126 | } |
121 | 127 | WCF::getDB()->commitTransaction(); |
122 | 128 |
|
|
0 commit comments