/** * @param $modelClassName * @param $attributeModelClassName * @return string * @throws NotSupportedException */ private function processFromJoinsForAttributeThatIsCastedUp($modelClassName, $attributeModelClassName) { assert('is_string($modelClassName)'); assert('is_string($attributeModelClassName)'); $attributeTableName = $attributeModelClassName::getTableName($attributeModelClassName); $tableAliasName = $attributeTableName; $castedDownModelClassName = $modelClassName; 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($modelClassName); if (!$this->joinTablesAdapter->isTableInFromTables($castedUpAttributeTableName)) { if ($castedDownModelClassName::getCanHaveBean()) { $onTableAliasName = $castedDownModelClassName::getTableName($castedDownModelClassName); } elseif ($castedDownFurtherModelClassName::getCanHaveBean()) { $onTableAliasName = $castedDownModelClassName::getTableName($castedDownFurtherModelClassName); } else { throw new NotSupportedException(); } $onTableAliasName = $this->joinTablesAdapter->addFromTableAndGetAliasName($castedUpAttributeTableName, self::resolveForeignKey($castedUpAttributeTableName), $onTableAliasName); } } } if (!$this->joinTablesAdapter->isTableInFromTables($attributeTableName)) { $modelClassName = static::resolveModelClassNameThatCanHaveTable($modelClassName, $castedDownModelClassName); $tableAliasName = $this->joinTablesAdapter->addFromTableAndGetAliasName($attributeTableName, self::resolveForeignKey($attributeTableName), $modelClassName::getTableName($modelClassName)); } return $tableAliasName; }
/** * For a give Contact name, run a partial search by * full name and retrieve contact models. * */ public static function getContactsByPartialFullName($partialName, $pageSize, $stateMetadataAdapterClassName = null) { assert('is_string($partialName)'); assert('is_int($pageSize)'); assert('$stateMetadataAdapterClassName == null || is_string($stateMetadataAdapterClassName)'); $personTableName = RedBeanModel::getTableName('Person'); $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('Contact'); if (!$joinTablesAdapter->isTableInFromTables('person')) { $joinTablesAdapter->addFromTableAndGetAliasName($personTableName, "{$personTableName}_id"); } $metadata = array('clauses' => array(), 'structure' => ''); if ($stateMetadataAdapterClassName != null) { $stateMetadataAdapter = new $stateMetadataAdapterClassName($metadata); $metadata = $stateMetadataAdapter->getAdaptedDataProviderMetadata(); $metadata['structure'] = '(' . $metadata['structure'] . ')'; } $where = RedBeanModelDataProvider::makeWhere('Contact', $metadata, $joinTablesAdapter); if ($where != null) { $where .= 'and'; } $where .= self::getWherePartForPartialNameSearchByPartialName($partialName); return Contact::getSubset($joinTablesAdapter, null, $pageSize, $where, "person.firstname, person.lastname"); }
/** * For both non related and related attributes, this method resolves whether a from join is needed. This occurs * for example if a model attribute is castedUp. And that attribute is a relation that needs to be joined in * order to search. Since that attribute is castedUp, the castedUp model needs to be from joined first. This * also applies if the attribute is not a relation and just a member on the castedUp model. In that scenario, * the castedUp model also needs to be joined. * * This methhod assumes if the attribute is not on the base model, that it is casted up not down from it. */ public static function resolveShouldAddFromTableAndGetAliasName(RedBeanModelAttributeToDataProviderAdapter $modelAttributeToDataProviderAdapter, RedBeanModelJoinTablesQueryAdapter $joinTablesAdapter) { $attributeTableName = $modelAttributeToDataProviderAdapter->getAttributeTableName(); $tableAliasName = $attributeTableName; if ($modelAttributeToDataProviderAdapter->getModelClassName() == 'User' && $modelAttributeToDataProviderAdapter->getAttributeModelClassName() == 'Person') { $modelTableName = $modelAttributeToDataProviderAdapter->getModelTableName(); if (!$joinTablesAdapter->isTableInFromTables('person')) { $personTableName = $attributeTableName; $joinTablesAdapter->addFromTableAndGetAliasName($personTableName, "{$personTableName}_id", $modelTableName); } } elseif ($modelAttributeToDataProviderAdapter->getAttributeModelClassName() != $modelAttributeToDataProviderAdapter->getModelClassName()) { $modelClassName = $modelAttributeToDataProviderAdapter->getModelClassName(); while (get_parent_class($modelClassName) != $modelAttributeToDataProviderAdapter->getAttributeModelClassName()) { $castedDownModelClassName = $modelClassName; $modelClassName = get_parent_class($modelClassName); $castedUpAttributeTableName = $modelClassName::getTableName($modelClassName); if (!$joinTablesAdapter->isTableInFromTables($castedUpAttributeTableName)) { $joinTablesAdapter->addFromTableAndGetAliasName($castedUpAttributeTableName, "{$castedUpAttributeTableName}_id", $castedDownModelClassName::getTableName($castedDownModelClassName)); } } if (!$joinTablesAdapter->isTableInFromTables($attributeTableName)) { $tableAliasName = $joinTablesAdapter->addFromTableAndGetAliasName($attributeTableName, "{$attributeTableName}_id", $modelClassName::getTableName($modelClassName)); } } return $tableAliasName; }