diff --git a/src/xPDO/Om/mysql/xPDOManager.php b/src/xPDO/Om/mysql/xPDOManager.php
index 26d2bdde..5a9e8b53 100644
--- a/src/xPDO/Om/mysql/xPDOManager.php
+++ b/src/xPDO/Om/mysql/xPDOManager.php
@@ -416,8 +416,18 @@ protected function getColumnDef($class, $name, $meta, array $options = array())
$notNull= !isset ($meta['null']) ? false : ($meta['null'] === 'false' || empty($meta['null']));
$null= $notNull ? ' NOT NULL' : ' NULL';
$extra= '';
- if (isset($meta['index']) && $meta['index'] == 'pk' && !is_array($pk) && $pktype == 'integer' && isset ($meta['generated']) && $meta['generated'] == 'native') {
- $extra= ' AUTO_INCREMENT';
+ $isGeneratedPkField = isset($meta['index']) && $meta['index'] == 'pk'
+ && isset($meta['generated']) && $meta['generated'] == 'native';
+ if ($isGeneratedPkField && ($meta['phptype'] ?? '') === 'integer') {
+ if (!is_array($pk)) {
+ $extra = ' AUTO_INCREMENT';
+ } else {
+ $primaryColumns = $this->xpdo->getIndexMeta($class)['PRIMARY']['columns'] ?? [];
+ reset($primaryColumns);
+ if (key($primaryColumns) === $name) {
+ $extra = ' AUTO_INCREMENT';
+ }
+ }
}
if (empty ($extra) && isset ($meta['extra'])) {
$extra= ' ' . $meta['extra'];
diff --git a/src/xPDO/Om/xPDOObject.php b/src/xPDO/Om/xPDOObject.php
index dcb4a641..5c549baf 100644
--- a/src/xPDO/Om/xPDOObject.php
+++ b/src/xPDO/Om/xPDOObject.php
@@ -1470,15 +1470,29 @@ public function save($cacheFlag= null) {
if ($result) {
if ($pkn && !$pk) {
if ($pkGenerated) {
- $this->_fields[$this->getPK()]= $this->getGeneratedKey();
+ if (is_array($pkn)) {
+ $generatedKey = $this->getGeneratedKey();
+ foreach ($pkn as $pkField => $v) {
+ if (isset($this->_fieldMeta[$pkField]['generated'])
+ && $this->_fieldMeta[$pkField]['generated'] === 'native') {
+ $this->_fields[$pkField] = $generatedKey;
+ break;
+ }
+ }
+ } else {
+ $this->_fields[$this->getPK()] = $this->getGeneratedKey();
+ }
}
- $pk= $this->getPrimaryKey();
+ $pk = $this->getPrimaryKey();
}
if ($pk || !$this->getPK()) {
$this->_dirty= array();
$this->_validated= array();
$this->_new= false;
}
+ if (!$pk && $pkGenerated) {
+ $this->xpdo->log(xPDO::LOG_LEVEL_WARN, "Could not retrieve generated key for class {$this->_class}.", '', __METHOD__, __FILE__, __LINE__);
+ }
$callback = $this->getOption(xPDO::OPT_CALLBACK_ON_SAVE);
if ($callback && is_callable($callback)) {
call_user_func($callback, array('className' => $this->_class, 'criteria' => $criteria, 'object' => $this));
diff --git a/test/model/schema/xPDO.Test.Sample.mysql.schema.xml b/test/model/schema/xPDO.Test.Sample.mysql.schema.xml
index 99adf864..18b2a877 100644
--- a/test/model/schema/xPDO.Test.Sample.mysql.schema.xml
+++ b/test/model/schema/xPDO.Test.Sample.mysql.schema.xml
@@ -88,6 +88,16 @@
+
-