/** * @param $modelClassName * @param $attributeModelClassName * @return string * @throws NotSupportedException */ private function processFromJoinsForAttributeThatIsCastedUp($modelClassName, $attributeModelClassName) { assert('is_string($modelClassName)'); assert('is_string($attributeModelClassName)'); $attributeTableName = $attributeModelClassName::getTableName(); $tableAliasName = $attributeTableName; $castedDownModelClassName = $modelClassName; $onTableAliasName = null; while (get_parent_class($modelClassName) != $attributeModelClassName && get_parent_class($modelClassName) != 'RedBeanModel') { $castedDownFurtherModelClassName = $castedDownModelClassName; $castedDownModelClassName = $modelClassName; $modelClassName = get_parent_class($modelClassName); if ($modelClassName::getCanHaveBean()) { $castedUpAttributeTableName = $modelClassName::getTableName(); if (!$this->joinTablesAdapter->isTableInFromTables($castedUpAttributeTableName)) { if ($onTableAliasName == null && $castedDownModelClassName::getCanHaveBean()) { $onTableAliasName = $castedDownModelClassName::getTableName(); } elseif ($onTableAliasName == null && $castedDownFurtherModelClassName::getCanHaveBean()) { $onTableAliasName = $castedDownFurtherModelClassName::getTableName(); } elseif ($onTableAliasName == null) { throw new NotSupportedException(); } $onTableAliasName = $this->joinTablesAdapter->addFromTableAndGetAliasName($castedUpAttributeTableName, self::resolveForeignKey($castedUpAttributeTableName), $onTableAliasName); } } } if (!$this->joinTablesAdapter->isTableInFromTables($attributeTableName)) { if ($onTableAliasName == null) { $modelClassName = static::resolveModelClassNameThatCanHaveTable($modelClassName, $castedDownModelClassName); $onTableAliasName = $modelClassName::getTableName(); } $tableAliasName = $this->joinTablesAdapter->addFromTableAndGetAliasName($attributeTableName, self::resolveForeignKey($attributeTableName), $onTableAliasName); } else { $existingTableAliasName = $this->joinTablesAdapter->getAlreadyFromJoinedTableAliasName($attributeTableName); if ($existingTableAliasName != null) { $tableAliasName = $existingTableAliasName; } } return $tableAliasName; }
public function testGetAlreadyFromJoinedTableAliasName() { $adapter = new RedBeanModelJoinTablesQueryAdapter('QueryFromModel'); $this->assertNull($adapter->GetAlreadyFromJoinedTableAliasName('zz')); $alias = $adapter->addFromTableAndGetAliasName('z', 'joinid'); $this->assertEquals($alias, $adapter->getAlreadyFromJoinedTableAliasName('z')); }