13 private readonly
array $uniqueFieldNames;
14 private readonly
array $uniqueDbColumns;
18 ?
array $uniqueFieldNames =
null,
21 $uniqueFieldNames ??= $this->entity->getPrimaryArray();
23 if (!Helper::isEntitySupportedByUniqueValidatingStrategies($this->entity, $uniqueFieldNames))
28 sort($uniqueFieldNames, SORT_STRING);
29 $this->uniqueFieldNames = $uniqueFieldNames;
31 $uniqueDbColumns = $this->replaceFieldNames($this->uniqueFieldNames);
32 sort($uniqueDbColumns, SORT_STRING);
33 $this->uniqueDbColumns = $uniqueDbColumns;
38 $updateDbFields = $this->getUpdateDbFields($dbFields, $this->uniqueDbColumns);
40 $insertedId = $this->merge(
43 $this->uniqueDbColumns,
46 $isDBChanged = $this->isDBChanged();
48 if ($insertedId !== 0)
50 return new AddedData($insertedId, $isDBChanged);
55 Helper::guessInsertedId($this->entity, $dbFields, $this->uniqueFieldNames),
63 foreach ($multiDbFields as &$dbFields)
66 ksort($dbFields, SORT_STRING);
69 $firstDbFields = reset($multiDbFields);
70 $updateDbColumns = array_keys(
71 $this->getUpdateDbFields($firstDbFields, $this->uniqueDbColumns),
77 $sql =
$connection->getSqlHelper()->prepareMergeValues(
78 $this->entity->getDBTableName(),
79 $this->uniqueDbColumns,
89 private function merge(
array $insertFields,
array $updateFields,
array $uniqueFieldNames): int
91 $sqlHelper = $this->entity->getConnection()->getSqlHelper();
93 $sql = $sqlHelper->prepareMerge(
94 $this->entity->getDBTableName(),
100 return Helper::executeAndGetInsertedId($this->entity, current($sql));
103 private function replaceFieldNames(
array $fieldNames):
array
106 foreach ($fieldNames as $fieldName)
108 $field = $this->entity->getField($fieldName);
121 private function getUpdateDbFields(
array $dbFields,
array $uniqueColumns):
array
124 foreach ($dbFields as $column => $value)
126 if (!in_array($column, $uniqueColumns,
true))
128 $update[$column] = $value;
135 private function isDBChanged(): bool
139 return $this->entity->getConnection()->getAffectedRowsCount() > 0;
__construct(private readonly Entity $entity, ?array $uniqueFieldNames=null,)
addMulti(array $multiDbFields)