12 private readonly
array $uniqueFieldNames;
16 ?
array $uniqueFieldNames =
null,
19 $this->uniqueFieldNames = $uniqueFieldNames ?? $this->entity->getPrimaryArray();
21 if (!Helper::isEntitySupportedByUniqueValidatingStrategies($this->entity, $this->uniqueFieldNames))
29 $insertedId = $this->insertIgnore($dbFields);
31 $isDBChanged = $this->isDBChanged();
33 if ($insertedId !== 0)
35 return new AddedData($insertedId, $isDBChanged);
40 Helper::guessInsertedId($this->entity, $dbFields, $this->uniqueFieldNames),
48 $this->insertIgnoreMulti($multiDbFields);
53 private function insertIgnore(
array $insertFields): int
55 $tableName = $this->entity->getDBTableName();
56 $sqlHelper = $this->entity->getConnection()->getSqlHelper();
58 [$sqlFieldNames, $sqlValues] = $sqlHelper->prepareInsert(
63 $sql = $sqlHelper->getInsertIgnore($tableName,
" ({$sqlFieldNames})",
" VALUES ({$sqlValues})");
65 return Helper::executeAndGetInsertedId($this->entity, $sql);
68 private function insertIgnoreMulti(
array $multiInsertFields): void
71 $tableName = $this->entity->getDBTableName();
78 foreach ($multiInsertFields as $insertFields)
80 $insert = $sqlHelper->prepareInsert($tableName, $insertFields,
true);
84 foreach ($insert[0] as $column)
86 $uniqueColumns[$column] =
true;
93 foreach ($inserts as $insert)
95 $columns = array_flip($insert[0]);
100 foreach (array_keys($uniqueColumns) as $column)
102 if (array_key_exists($column, $columns))
105 $finalValues[] = $values[$columns[$column]];
110 $finalValues[] =
'DEFAULT';
114 $sqlValues[] =
'(' . join(
', ', $finalValues) .
')';
117 $sql = $sqlHelper->getInsertIgnore(
119 '(' . join(
', ', array_keys($uniqueColumns)) .
')',
120 'VALUES ' . join(
', ', $sqlValues),
126 private function isDBChanged(): bool
130 return $this->entity->getConnection()->getAffectedRowsCount() > 0;
__construct(private readonly Entity $entity, ?array $uniqueFieldNames=null,)
addMulti(array $multiDbFields)