5 use wcf\system\database\exception\DatabaseQueryExecutionException
;
6 use wcf\system\database\util\PreparedStatementConditionBuilder
;
10 * Basic implementation for object editors following the decorator pattern.
13 * @copyright 2001-2019 WoltLab GmbH
14 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
15 * @package WoltLabSuite\Core\Data
17 abstract class DatabaseObjectEditor
extends DatabaseObjectDecorator
implements IEditableObject
20 TFastCreate
::fastCreate
as private dboEditorCreateBase
;
26 public static function create(array $parameters = [])
28 return new static::$baseClass(static::dboEditorCreateBase($parameters));
34 public function update(array $parameters = [])
36 if (empty($parameters)) {
41 $statementParameters = [];
42 foreach ($parameters as $key => $value) {
43 if (!empty($updateSQL)) {
46 $updateSQL .= $key . ' = ?';
47 $statementParameters[] = $value;
49 $statementParameters[] = $this->getObjectID();
51 $sql = "UPDATE " . static::getDatabaseTableName() . "
52 SET " . $updateSQL . "
53 WHERE " . static::getDatabaseTableIndexName() . " = ?";
54 $statement = WCF
::getDB()->prepareStatement($sql);
55 $statement->execute($statementParameters);
61 public function updateCounters(array $counters = [])
63 if (empty($counters)) {
68 $statementParameters = [];
69 foreach ($counters as $key => $value) {
70 if (!empty($updateSQL)) {
73 $updateSQL .= $key . ' = ' . $key . ' + ?';
74 $statementParameters[] = $value;
76 $statementParameters[] = $this->getObjectID();
78 $sql = "UPDATE " . static::getDatabaseTableName() . "
79 SET " . $updateSQL . "
80 WHERE " . static::getDatabaseTableIndexName() . " = ?";
81 $statement = WCF
::getDB()->prepareStatement($sql);
82 $statement->execute($statementParameters);
88 public function delete()
90 static::deleteAll([$this->getObjectID()]);
96 public static function deleteAll(array $objectIDs = [])
100 $itemsPerLoop = 1000;
101 $loopCount = \
ceil(\
count($objectIDs) / $itemsPerLoop);
103 WCF
::getDB()->beginTransaction();
104 for ($i = 0; $i < $loopCount; $i++
) {
105 $batchObjectIDs = \array_slice
($objectIDs, $i * $itemsPerLoop, $itemsPerLoop);
107 $conditionBuilder = new PreparedStatementConditionBuilder();
108 $conditionBuilder->add(static::getDatabaseTableIndexName() . ' IN (?)', [$batchObjectIDs]);
110 $sql = "DELETE FROM " . static::getDatabaseTableName() . "
111 " . $conditionBuilder;
112 $statement = WCF
::getDB()->prepareStatement($sql);
113 $statement->execute($conditionBuilder->getParameters());
114 $affectedCount +
= $statement->getAffectedRows();
116 WCF
::getDB()->commitTransaction();
118 return $affectedCount;
122 * Creates a new object, returns null if the row already exists.
124 * @param array $parameters
125 * @return IStorableObject|null
128 public static function createOrIgnore(array $parameters = [])
131 return static::create($parameters);
132 } catch (DatabaseQueryExecutionException
$e) {
133 // Error code 23000 = duplicate key
134 if ($e->getCode() == '23000' && $e->getDriverCode() == '1062') {