Browse Source

Merge pull request #12028 from jeremyharris/findorcreate

findOrCreate never fires Model.afterSaveCommit
Mark Story 8 years ago
parent
commit
836da74092
2 changed files with 13 additions and 3 deletions
  1. 8 2
      src/ORM/Table.php
  2. 5 1
      tests/TestCase/ORM/TableTest.php

+ 8 - 2
src/ORM/Table.php

@@ -1677,12 +1677,18 @@ class Table implements RepositoryInterface, EventListenerInterface, EventDispatc
     {
         $options += [
             'atomic' => true,
-            'defaults' => true
+            'defaults' => true,
         ];
 
-        return $this->_executeTransaction(function () use ($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'], true)) {
+            $this->dispatchEvent('Model.afterSaveCommit', compact('entity', 'options'));
+        }
+
+        return $entity;
     }
 
     /**

+ 5 - 1
tests/TestCase/ORM/TableTest.php

@@ -6150,6 +6150,9 @@ class TableTest extends TestCase
     public function testFindOrCreateTransactions()
     {
         $articles = $this->getTableLocator()->get('Articles');
+        $articles->getEventManager()->on('Model.afterSaveCommit', function ($event, $entity) {
+            $entity->afterSaveCommit = true;
+        });
 
         $article = $articles->findOrCreate(function ($query) {
             $this->assertInstanceOf('Cake\ORM\Query', $query);
@@ -6157,12 +6160,13 @@ class TableTest extends TestCase
             $this->assertTrue($this->connection->inTransaction());
         }, function ($article) {
             $this->assertInstanceOf('Cake\Datasource\EntityInterface', $article);
-            $this->assertTrue($this->connection->inTransaction());
             $article->title = 'Success';
+            $this->assertTrue($this->connection->inTransaction());
         });
         $this->assertFalse($article->isNew());
         $this->assertNotNull($article->id);
         $this->assertEquals('Success', $article->title);
+        $this->assertTrue($article->afterSaveCommit);
     }
 
     /**