Skip to content

Commit

Permalink
Adding fix and test for #3626
Browse files Browse the repository at this point in the history
The code was assuming that if oyu passed _joinData to the save method
that belonged to something already in the database, which was not all of
the time. Removing the assumption, but also making saving a long list of
associaitions a bit slower as it has to check the existance of the row
first.
  • Loading branch information
lorenzo committed Jun 3, 2014
1 parent 6e363d3 commit 730a80f
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 2 deletions.
1 change: 0 additions & 1 deletion src/ORM/Association/BelongsToMany.php
Expand Up @@ -822,7 +822,6 @@ protected function _collectJointEntities($sourceEntity, $targetEntities) {
continue;
}

$joint->isNew(false);
$result[] = $joint;
}

Expand Down
52 changes: 52 additions & 0 deletions tests/Fixture/SpecialTagFixture.php
@@ -0,0 +1,52 @@
<?php
/**
* CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
* 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')
);
}

41 changes: 40 additions & 1 deletion tests/TestCase/ORM/QueryRegressionTest.php
Expand Up @@ -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
Expand Down Expand Up @@ -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'));
}

}

0 comments on commit 730a80f

Please sign in to comment.