/** * @return array|null null if not covered by only pk */ public function extractPrimaryKey(Criteria $criteria) { $pkCols = $this->getPrimaryKeys(); if (count($pkCols) !== count($criteria->getMap())) { return null; } $pk = []; foreach ($pkCols as $pkCol) { $fqName = $pkCol->getFullyQualifiedName(); $name = $pkCol->getName(); if ($criteria->containsKey($fqName)) { $value = $criteria->getValue($fqName); } else { if ($criteria->containsKey($name)) { $value = $criteria->getValue($name); } else { return null; } } $pk[$name] = $value; } return $pk; }
/** * Add the content of a Criteria to the current Criteria * In case of conflict, the current Criteria keeps its properties * * @param Criteria $criteria The criteria to read properties from * @param string $operator The logical operator used to combine conditions * Defaults to Criteria::LOGICAL_AND, also accepts Criteria::LOGICAL_OR * This parameter is deprecated, use _or() instead * * @return $this|Criteria The current criteria object */ public function mergeWith(Criteria $criteria, $operator = null) { // merge limit $limit = $criteria->getLimit(); if (0 != $limit && -1 === $this->getLimit()) { $this->limit = $limit; } // merge offset $offset = $criteria->getOffset(); if (0 != $offset && 0 === $this->getOffset()) { $this->offset = $offset; } // merge select modifiers $selectModifiers = $criteria->getSelectModifiers(); if ($selectModifiers && !$this->selectModifiers) { $this->selectModifiers = $selectModifiers; } // merge select columns $this->selectColumns = array_merge($this->getSelectColumns(), $criteria->getSelectColumns()); // merge as columns $commonAsColumns = array_intersect_key($this->getAsColumns(), $criteria->getAsColumns()); if (!empty($commonAsColumns)) { throw new LogicException('The given criteria contains an AsColumn with an alias already existing in the current object'); } $this->asColumns = array_merge($this->getAsColumns(), $criteria->getAsColumns()); // merge orderByColumns $orderByColumns = array_merge($this->getOrderByColumns(), $criteria->getOrderByColumns()); $this->orderByColumns = array_unique($orderByColumns); // merge groupByColumns $groupByColumns = array_merge($this->getGroupByColumns(), $criteria->getGroupByColumns()); $this->groupByColumns = array_unique($groupByColumns); // merge where conditions if (Criteria::LOGICAL_OR === $operator) { $this->_or(); } $isFirstCondition = true; foreach ($criteria->getMap() as $key => $criterion) { if ($isFirstCondition && Criteria::LOGICAL_OR === $this->defaultCombineOperator) { $this->addOr($criterion, null, null, false); $this->defaultCombineOperator = Criteria::LOGICAL_AND; } elseif ($this->containsKey($key)) { $this->addAnd($criterion); } else { $this->add($criterion); } $isFirstCondition = false; } // merge having $having = $criteria->getHaving(); if ($having) { if ($this->getHaving()) { $this->addHaving($this->getHaving()->addAnd($having)); } else { $this->addHaving($having); } } // merge alias $commonAliases = array_intersect_key($this->getAliases(), $criteria->getAliases()); if (!empty($commonAliases)) { throw new LogicException('The given criteria contains an alias already existing in the current object'); } $this->aliases = array_merge($this->getAliases(), $criteria->getAliases()); // merge join $this->joins = array_merge($this->getJoins(), $criteria->getJoins()); return $this; }