protected static function canAggregateInMySql(Repository $repository, $columnName, &$relationshipsToAutoHydrate) { $schema = $repository->getSchema(); $columns = $schema->getColumns(); if (isset($columns[$columnName])) { return true; } if (strpos($columnName, ".") !== false) { // If the column name contains a dot, the part before the dot is the name of a relationship to another model list($relationship, $columnName) = explode(".", $columnName, 2); $relationships = SolutionSchema::getAllRelationshipsForModel($repository->getModelClass()); // Check for the name being that of a relationship if (isset($relationships[$relationship]) && $relationships[$relationship] instanceof OneToMany) { $targetModelName = $relationships[$relationship]->getTargetModelName(); $targetSchema = SolutionSchema::getModelSchema($targetModelName); $targetColumns = $targetSchema->getColumns(); // Check for the column name in the schema of the related model if (isset($targetColumns[$columnName])) { $relationshipsToAutoHydrate[] = $relationship; return true; } } } return false; }
protected static function doFilterWithRepository(Repository $repository, Filter $originalFilter, &$params, &$relationshipsToAutoHydrate) { $relationshipsToAutoHydrate[] = $originalFilter->collectionProperty; // Get the relationship $relationships = SolutionSchema::getAllRelationshipsForModel($repository->getModelClass()); /** * @var OneToMany $relationship */ $relationship = $relationships[$originalFilter->collectionProperty]; $columnName = $relationship->getNavigationPropertyName() . "`.`" . $originalFilter->columnName; $paramName = uniqid() . str_replace("`.`", "", $columnName); $params[$paramName] = $originalFilter->equalTo; $originalFilter->filteredByRepository = true; return "`{$columnName}` = :{$paramName}"; }
protected static final function getTransformedComparisonValueForRepository($columnName, $rawComparisonValue, Repository $repository) { $exampleObject = SolutionSchema::getModel($repository->getModelClass()); $columnSchema = $exampleObject->getColumnSchemaForColumnReference($columnName); if ($columnSchema != null) { // Transform the value first into model data. This function should sanitise the value as // the model data transforms expect inputs passed by unwary developers. $closure = $columnSchema->getTransformIntoModelData(); if ($closure !== null) { $rawComparisonValue = $closure($rawComparisonValue); } $closure = $columnSchema->getTransformIntoRepository(); if ($closure !== null) { $rawComparisonValue = $closure($rawComparisonValue); } } return $rawComparisonValue; }