diff --git a/src/ORM/Association/BelongsToMany.php b/src/ORM/Association/BelongsToMany.php index 8ef09f3e840..a9a6b33bfa7 100644 --- a/src/ORM/Association/BelongsToMany.php +++ b/src/ORM/Association/BelongsToMany.php @@ -822,7 +822,6 @@ protected function _collectJointEntities($sourceEntity, $targetEntities) { continue; } - $joint->isNew(false); $result[] = $joint; } diff --git a/tests/Fixture/SpecialTagFixture.php b/tests/Fixture/SpecialTagFixture.php new file mode 100644 index 00000000000..297b7ac5b17 --- /dev/null +++ b/tests/Fixture/SpecialTagFixture.php @@ -0,0 +1,52 @@ + + * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * + * Licensed under The MIT License + * For full copyright and license information, please see the LICENSE.txt + * Redistributions of files must retain the above copyright notice + * + * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * @link http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests + * @since 3.0.0 + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Cake\Test\Fixture; + +use Cake\TestSuite\Fixture\TestFixture; + +/** + * A fixture for a join table containing additional data + * + */ +class SpecialTagFixture extends TestFixture { + +/** + * fields property + * + * @var array + */ + public $fields = array( + 'id' => ['type' => 'integer'], + 'article_id' => ['type' => 'integer', 'null' => false], + 'tag_id' => ['type' => 'integer', 'null' => false], + 'highlighted' => ['type' => 'boolean', 'null' => true], + 'highlighted_time' => ['type' => 'timestamp', 'null' => true], + '_constraints' => [ + 'primary' => ['type' => 'primary', 'columns' => ['id']], + 'UNIQUE_TAG2' => ['type' => 'unique', 'columns' => ['article_id', 'tag_id']] + ] + ); + +/** + * records property + * + * @var array + */ + public $records = array( + array('article_id' => 1, 'tag_id' => 3, 'highlighted' => false, 'highlighted_time' => null), + array('article_id' => 2, 'tag_id' => 1, 'highlighted' => true, 'highlighted_time' => '2014-06-01 10:10:00') + ); +} + diff --git a/tests/TestCase/ORM/QueryRegressionTest.php b/tests/TestCase/ORM/QueryRegressionTest.php index 83ca62dc37e..2d7e71dd225 100644 --- a/tests/TestCase/ORM/QueryRegressionTest.php +++ b/tests/TestCase/ORM/QueryRegressionTest.php @@ -31,7 +31,14 @@ class QueryRegressionTest extends TestCase { * * @var array */ - public $fixtures = ['core.user', 'core.article', 'core.tag', 'core.articles_tag', 'core.author']; + public $fixtures = [ + 'core.user', + 'core.article', + 'core.tag', + 'core.articles_tag', + 'core.author', + 'core.special_tag' + ]; /** * Tear down @@ -119,4 +126,36 @@ public function testNullableTimeColumn() { $this->assertNull($entity->created); } + +/** + * Test for https://github.com/cakephp/cakephp/issues/3626 + * + * Checks that join data is actually created and not tried to be updated every time + * @return void + */ + public function testCreateJointData() { + $articles = TableRegistry::get('Articles'); + $articles->belongsToMany('Highligths', [ + 'className' => 'TestApp\Model\Table\TagsTable', + 'foreignKey' => 'article_id', + 'targetForeignKey' => 'tag_id', + 'through' => 'SpecialTags' + ]); + $entity = $articles->get(2); + $data = [ + 'id' => 2, + 'highligths' => [ + [ + 'name' => 'New Special Tag', + '_joinData' => ['highlighted' => true, 'highlighted_time' => '2014-06-01 10:10:00'] + ] + ] + ]; + $entity = $articles->patchEntity($entity, $data, ['Highligths' => ['associated' => ['_joinData']]]); + $articles->save($entity); + $entity = $articles->get(2, ['contain' => ['Highligths']]); + $this->assertEquals(4, $entity->highligths[0]->_joinData->tag_id); + $this->assertEquals('2014-06-01', $entity->highligths[0]->_joinData->highlighted_time->format('Y-m-d')); + } + }