/** * Constructor. * * @see ModelType How to use the preferred choices. * * @param string $class The FQCN of the model class to be loaded. * @param string $labelPath A property path pointing to the property used for the choice labels. * @param array $choices An optional array to use, rather than fetching the models. * @param \ModelCriteria $queryObject The query to use retrieving model data from database. * @param string $groupPath A property path pointing to the property used to group the choices. * @param array|\ModelCriteria $preferred The preferred items of this choice. * Either an array if $choices is given, * or a \ModelCriteria to be merged with the $queryObject. * @param PropertyAccessorInterface $propertyAccessor The reflection graph for reading property paths. * @param string $useAsIdentifier a custom unique column (eg slug) to use instead of primary key. * * @throws MissingOptionsException In case the class parameter is empty. * @throws InvalidOptionsException In case the query class is not found. */ public function __construct($class, $labelPath = null, $choices = null, $queryObject = null, $groupPath = null, $preferred = array(), PropertyAccessorInterface $propertyAccessor = null, $useAsIdentifier = null) { $this->class = $class; $queryClass = $this->class . 'Query'; if (!class_exists($queryClass)) { if (empty($this->class)) { throw new MissingOptionsException('The "class" parameter is empty, you should provide the model class'); } throw new InvalidOptionsException(sprintf('The query class "%s" is not found, you should provide the FQCN of the model class', $queryClass)); } $query = new $queryClass(); $this->query = $queryObject ?: $query; if ($useAsIdentifier) { $this->identifier = array($this->query->getTableMap()->getColumn($useAsIdentifier)); } else { $this->identifier = $this->query->getTableMap()->getPrimaryKeys(); } $this->loaded = is_array($choices) || $choices instanceof \Traversable; if ($preferred instanceof \ModelCriteria) { $this->preferredQuery = $preferred->mergeWith($this->query); } if (!$this->loaded) { // Make sure the constraints of the parent constructor are // fulfilled $choices = array(); $preferred = array(); } if (1 === count($this->identifier) && $this->isScalar(current($this->identifier))) { $this->identifierAsIndex = true; } parent::__construct($choices, $labelPath, $preferred, $groupPath, null, $propertyAccessor); }
protected function filterBySelection(\ModelCriteria $query) { $item = $this->getSelection(); if ($item) { $relations = $this->query->getTableMap()->getRelations(); foreach ($relations as $relation) { if ($relation->getRightTable()->getPhpName() == get_class($item) && in_array($relation->getType(), array(\RelationMap::MANY_TO_ONE))) { $query->{'filterBy' . $relation->getName()}($item); } } } }
public static function create(\ModelCriteria $q, $relation, $relationAlias = null, $joinType = \Criteria::INNER_JOIN) { $tableMap = $q->getTableMap(); $relationMap = $tableMap->getRelation($relation); // create a Join object for this join $join = new static(); $join->setJoinType($joinType); $join->setRelationMap($relationMap, $q->getModelAlias(), $relationAlias); if ($previousJoin = $q->getPreviousJoin()) { $join->setPreviousJoin($previousJoin); } // add the ModelJoin to the current object if ($relationAlias) { $q->addAlias($relationAlias, $relationMap->getRightTable()->getName()); $q->addJoinObject($join, $relationAlias); } else { $q->addJoinObject($join, $relationMap->getRightTable()->getName()); } return $join; }
/** * This method will determine the primary key field name from a query object. * * @param ModelCriteria $query * @return string */ protected function getPrimaryKeyFieldName($query) { $primaryKeyColumns = $query->getTableMap()->getPrimaryKeyColumns(); $primaryKeyColumn = reset($primaryKeyColumns); return $primaryKeyColumn->getPhpName(); }