Skip to content
Permalink
Browse files

In BelongsToMany, linking entities will set the junction table regist…

…ry alias
  • Loading branch information...
nojimage committed Oct 2, 2018
1 parent 9110e6c commit e4af9c44426436fcc8ffc93a9cd620b762577a1a
Showing with 43 additions and 2 deletions.
  1. +2 −2 src/ORM/Association/BelongsToMany.php
  2. +41 −0 tests/TestCase/ORM/Association/BelongsToManyTest.php
@@ -825,12 +825,12 @@ protected function _saveLinks(EntityInterface $sourceEntity, $targetEntities, $o
$targetPrimaryKey = (array)$target->getPrimaryKey();
$bindingKey = (array)$this->getBindingKey();
$jointProperty = $this->_junctionProperty;
$junctionAlias = $junction->getAlias();
$junctionRegistryAlias = $junction->getRegistryAlias();
foreach ($targetEntities as $e) {
$joint = $e->get($jointProperty);
if (!$joint || !($joint instanceof EntityInterface)) {
$joint = new $entityClass([], ['markNew' => true, 'source' => $junctionAlias]);
$joint = new $entityClass([], ['markNew' => true, 'source' => $junctionRegistryAlias]);
}
$sourceKeys = array_combine($foreignKey, $sourceEntity->extract($bindingKey));
$targetKeys = array_combine($assocForeignKey, $e->extract($targetPrimaryKey));
@@ -599,6 +599,47 @@ public function testLinkSuccessWithMocks()
$this->assertSame($entity->test, $tags);
}
/**
* Tests that linking entities will set the junction table registry alias
*
* @return void
*/
public function testLinkSetSourceToJunctionEntities()
{
$connection = ConnectionManager::get('test');
$joint = $this->getMockBuilder('\Cake\ORM\Table')
->setMethods(['save', 'getPrimaryKey'])
->setConstructorArgs([['alias' => 'ArticlesTags', 'connection' => $connection]])
->getMock();
$joint->setRegistryAlias('Plugin.ArticlesTags');
$config = [
'sourceTable' => $this->article,
'targetTable' => $this->tag,
'through' => $joint,
];
$assoc = new BelongsToMany('Tags', $config);
$opts = ['markNew' => false];
$entity = new Entity(['id' => 1], $opts);
$tags = [new Entity(['id' => 2], $opts)];
$joint->method('getPrimaryKey')
->will($this->returnValue(['article_id', 'tag_id']));
$joint->expects($this->once())
->method('save')
->will($this->returnCallback(function (Entity $e, $opts) {
$this->assertSame('Plugin.ArticlesTags', $e->getSource());
return $e;
}));
$this->assertTrue($assoc->link($entity, $tags));
$this->assertSame($entity->tags, $tags);
$this->assertSame('Plugin.ArticlesTags', $entity->tags[0]->get('_joinData')->getSource());
}
/**
* Test liking entities having a non persisted source entity
*

0 comments on commit e4af9c4

Please sign in to comment.
You can’t perform that action at this time.