/** * Returns an array having as keys a dotted path of associations that participate * in this eager loader. The values of the array will contain the following keys * * - alias: The association alias * - instance: The association instance * - canBeJoined: Whether or not the association will be loaded using a JOIN * - entityClass: The entity that should be used for hydrating the results * - nestKey: A dotted path that can be used to correctly insert the data into the results. * - matching: Whether or not it is an association loaded through `matching()`. * * @param \Cake\ORM\Table $table The table containing the association that * will be normalized * @return array */ public function associationsMap($table) { $map = []; if (!$this->matching() && !$this->contain() && empty($this->_joinsMap)) { return $map; } $visitor = function ($level, $matching = false) use(&$visitor, &$map) { foreach ($level as $assoc => $meta) { $canBeJoined = $meta->canBeJoined(); $instance = $meta->instance(); $associations = $meta->associations(); $forMatching = $meta->forMatching(); $map[] = ['alias' => $assoc, 'instance' => $instance, 'canBeJoined' => $canBeJoined, 'entityClass' => $instance->target()->entityClass(), 'nestKey' => $canBeJoined ? $assoc : $meta->aliasPath(), 'matching' => $forMatching !== null ? $forMatching : $matching]; if ($canBeJoined && $associations) { $visitor($associations, $matching); } } }; $visitor($this->_matching->normalized($table), true); $visitor($this->normalized($table)); $visitor($this->_joinsMap); return $map; }
/** * Tests that the path for gettings to a deep assocition is materialized in an * array key * * @return void */ public function testNormalizedPath() { $contains = ['clients' => ['orders' => ['orderTypes', 'stuff' => ['stuffTypes']], 'companies' => ['categories']]]; $query = $this->getMock('\\Cake\\ORM\\Query', ['join'], [$this->connection, $this->table]); $loader = new EagerLoader(); $loader->contain($contains); $normalized = $loader->normalized($this->table); $this->assertEquals('clients', $normalized['clients']->aliasPath()); $this->assertEquals('client', $normalized['clients']->propertyPath()); $assocs = $normalized['clients']->associations(); $this->assertEquals('clients.orders', $assocs['orders']->aliasPath()); $this->assertEquals('client.order', $assocs['orders']->propertyPath()); $assocs = $assocs['orders']->associations(); $this->assertEquals('clients.orders.orderTypes', $assocs['orderTypes']->aliasPath()); $this->assertEquals('client.order.order_type', $assocs['orderTypes']->propertyPath()); $this->assertEquals('clients.orders.stuff', $assocs['stuff']->aliasPath()); $this->assertEquals('client.order.stuff', $assocs['stuff']->propertyPath()); $assocs = $assocs['stuff']->associations(); $this->assertEquals('clients.orders.stuff.stuffTypes', $assocs['stuffTypes']->aliasPath()); $this->assertEquals('client.order.stuff.stuff_type', $assocs['stuffTypes']->propertyPath()); }
/** * Test clearing containments but not matching joins. * * @return void */ public function testClearContain() { $contains = ['clients' => ['orders' => ['orderTypes', 'stuff' => ['stuffTypes']], 'companies' => ['categories']]]; $loader = new EagerLoader(); $loader->contain($contains); $loader->matching('clients.addresses'); $this->assertNull($loader->clearContain()); $result = $loader->normalized($this->table); $this->assertEquals([], $result); $this->assertArrayHasKey('clients', $loader->matching()); }