Browse Source

Merge pull request #12619 from nojimage/fixes-belongstomany-joint-source

In BelongsToMany, linking entities will set the junction table registry alias
Mark Story 7 years ago
parent
commit
95222a0583

+ 2 - 2
src/ORM/Association/BelongsToMany.php

@@ -825,12 +825,12 @@ class BelongsToMany extends Association
         $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));

+ 41 - 0
tests/TestCase/ORM/Association/BelongsToManyTest.php

@@ -600,6 +600,47 @@ class BelongsToManyTest extends TestCase
     }
 
     /**
+     * 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
      *
      * @return void