13 private function __construct()
20 self::isUniqueIdenticalToPrimary(
$entity, $uniqueFieldNames)
22 self::isEntityHasAutoIncrementID(
$entity) && !self::isUniqueContainsPrimary(
$entity, $uniqueFieldNames)
27 private static function isUniqueIdenticalToPrimary(
Entity $entity,
array $uniqueFieldNames): bool
29 $primary =
$entity->getPrimaryArray();
30 sort($primary, SORT_STRING);
31 sort($uniqueFieldNames, SORT_STRING);
33 return $primary === $uniqueFieldNames;
36 private static function isEntityHasAutoIncrementID(
Entity $entity): bool
38 if (empty(
$entity->getAutoIncrement()))
43 return $entity->getPrimaryArray() === [
$entity->getAutoIncrement()];
46 private static function isUniqueContainsPrimary(
Entity $entity,
array $uniqueFieldNames): bool
48 $intersect = array_intersect($uniqueFieldNames,
$entity->getPrimaryArray());
50 return !empty($intersect);
59 $autoIncrementColumn =
$entity->getField(
$entity->getAutoIncrement())->getColumnName();
61 $sql .=
" RETURNING {$autoIncrementColumn}";
69 return (
int)reset($row);
86 array $uniqueFieldNames,
93 if (empty(
$entity->getAutoIncrement()))
100 $modifiedData = self::replaceColumnNamesWithFieldNames(
$entity, $dbFields);
102 $row = self::fetchProbablyOriginalRow(
$entity, $modifiedData, $uniqueFieldNames);
108 return self::extractInsertedId($row,
$entity->getAutoIncrement());
113 $columnToFieldMap = [];
114 foreach (
$entity->getScalarFields() as $field)
116 $columnToFieldMap[$field->getColumnName()] = $field->getName();
120 foreach ($dbFields as $column => $value)
122 $fieldName = $columnToFieldMap[$column] ?? $column;
130 private static function fetchProbablyOriginalRow(
133 array $uniqueFieldNames,
137 ->setSelect([
$entity->getAutoIncrement()])
141 foreach ($modifiedData as $field => $value)
143 if (in_array($field, $uniqueFieldNames,
true))
145 $query->where($field, $value);
152 private static function extractInsertedId(
array $row,
string $primaryFieldName): int
154 $value = $row[$primaryFieldName] ??
null;
155 if (is_numeric($value))
static guessInsertedId(Entity $entity, array $dbFields, array $uniqueFieldNames,)
static isEntitySupportedByUniqueValidatingStrategies(Entity $entity, array $uniqueFieldNames)
static executeAndGetInsertedId(Entity $entity, string $sql)