Browse Source

Re-wrapped _processFindOrCreate in transaction, manually dispatched afterSaveCommit

Jeremy Harris 8 years ago
parent
commit
58bb5f459f
2 changed files with 13 additions and 2 deletions
  1. 11 2
      src/ORM/Table.php
  2. 2 0
      tests/TestCase/ORM/TableTest.php

+ 11 - 2
src/ORM/Table.php

@@ -1677,10 +1677,19 @@ class Table implements RepositoryInterface, EventListenerInterface, EventDispatc
     {
         $options += [
             'atomic' => true,
-            'defaults' => true
+            'defaults' => true,
+            '_primary' => true,
         ];
 
-        return $this->_processFindOrCreate($search, $callback, $options);
+        $entity = $this->_executeTransaction(function () use ($search, $callback, $options) {
+            return $this->_processFindOrCreate($search, $callback, $options);
+        }, $options['atomic']);
+
+        if ($entity && $this->_transactionCommitted($options['atomic'], $options['_primary'])) {
+            $this->dispatchEvent('Model.afterSaveCommit', compact('entity', 'options'));
+        }
+
+        return $entity;
     }
 
     /**

+ 2 - 0
tests/TestCase/ORM/TableTest.php

@@ -6157,9 +6157,11 @@ class TableTest extends TestCase
         $article = $articles->findOrCreate(function ($query) {
             $this->assertInstanceOf('Cake\ORM\Query', $query);
             $query->where(['title' => 'Find Something New']);
+            $this->assertTrue($this->connection->inTransaction());
         }, function ($article) {
             $this->assertInstanceOf('Cake\Datasource\EntityInterface', $article);
             $article->title = 'Success';
+            $this->assertTrue($this->connection->inTransaction());
         });
         $this->assertFalse($article->isNew());
         $this->assertNotNull($article->id);