/** * @param $onTableAliasName * @param bool $canUseFromJoins * @return null|string */ protected function resolveJoinsForDerivedRelationViaCastedUpModel($onTableAliasName, $canUseFromJoins = true) { assert('is_string($onTableAliasName)'); assert('is_bool($canUseFromJoins)'); //First cast up $onTableAliasName = $this->resolveJoinsForDerivedRelationViaCastedUpModelThatIsCastedUp($onTableAliasName, $canUseFromJoins); //Second build relation across to the opposing model $onTableAliasName = $this->resolveJoinsForDerivedRelationViaCastedUpModelThatIsManyToMany($onTableAliasName); //Third cast down if necessary if ($this->modelAttributeToDataProviderAdapter->isDerivedRelationViaCastedUpModelDifferentThanOpposingModelClassName()) { $opposingRelationModelClassName = $this->modelAttributeToDataProviderAdapter->getOpposingRelationModelClassName(); $derivedRelationModelClassName = $this->modelAttributeToDataProviderAdapter->getDerivedRelationViaCastedUpModelClassName(); $onTableAliasName = $this->resolveAndProcessLeftJoinsForAttributeThatIsCastedDownOrUp($opposingRelationModelClassName, $derivedRelationModelClassName, $onTableAliasName); } return $onTableAliasName; }