public function fieldKeys()
{
$entityName = $this->entityName;
$table = $entityName::table();
$formattedFields = $this->fields();
// Keys...
$ki = 0;
$tableKeys = ['primary' => [], 'unique' => [], 'index' => []];
$usedKeyNames = [];
foreach ($formattedFields as $fieldInfo) {
$fieldName = $fieldInfo['column'];
// Determine key field name (can't use same key name twice, so we have to append a number)
$fieldKeyName = $table . '_' . $fieldName;
while (in_array($fieldKeyName, $usedKeyNames)) {
$fieldKeyName = $fieldName . '_' . $ki;
}
// Key type
if ($fieldInfo['primary']) {
$tableKeys['primary'][] = $fieldName;
}
if ($fieldInfo['unique']) {
if (!is_array($fieldInfo['unique'])) {
$fieldInfo['unique'] = [$fieldInfo['unique']];
}
foreach ($fieldInfo['unique'] as $fieldInfoUnique) {
$fieldKeyName = $this->computeIndexName($table, $fieldInfoUnique) ?: $fieldKeyName;
$tableKeys['unique'][$fieldKeyName][] = $fieldName;
$usedKeyNames[] = $fieldKeyName;
}
}
if ($fieldInfo['index']) {
if (!is_array($fieldInfo['index'])) {
$fieldInfo['index'] = [$fieldInfo['index']];
}
foreach ($fieldInfo['index'] as $fieldInfoIndex) {
$fieldKeyName = $this->computeIndexName($table, $fieldInfoIndex) ?: $fieldKeyName;
$tableKeys['index'][$fieldKeyName][] = $fieldName;
$usedKeyNames[] = $fieldKeyName;
}
}
}
return $tableKeys;
}