예제 #1
0
 /**
  * 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());
 }
예제 #3
0
 /**
  * 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());
 }