예제 #1
0
 /**
  * Возвращает объект содержащий в себе свойства связи (объект bridge-коллекции) либо null, если такого нет
  * @param IObject $object связанный объект (объект target-коллекции)
  * @throws InvalidArgumentException если передан объект неподходящей коллекции
  * @return IObject|null
  */
 protected function getLinkObject(IObject $object)
 {
     $collectionName = $this->field->getTargetCollectionName();
     $collection = $object->getCollection();
     if ($collectionName != $collection->getName() && ($collection instanceof ILinkedHierarchicCollection && $collection->getCommonHierarchy()->getName())) {
         throw new InvalidArgumentException($this->translate('Cannot get linked object. IObject from wrong collection is given.'));
     }
     if ($this->set->contains($object) && ($data = $this->set->offsetGet($object))) {
         return $data['linkObject'];
     }
     if ($this->isCompletelyLoaded && !$this->set->contains($object) || $object->getIsNew()) {
         return null;
     }
     $linkObject = $this->getBridgeCollection()->select()->where($this->field->getRelatedFieldName())->equals($this->object)->where($this->field->getTargetFieldName())->equals($object)->limit(1)->result()->fetch();
     if (!$linkObject instanceof IObject) {
         return null;
     }
     $this->attachObjectToStorage($object, array('linkObject' => $linkObject, 'deleted' => false));
     return $linkObject;
 }
예제 #2
0
 /**
  * Применяет JOIN'ы для MANY_TO_MANY через bridge-коллекцию
  * @param ISelectBuilder $selectBuilder
  * @param ManyToManyRelationField $relationField поле по которому осуществляется связь
  * @param string $relationSourceAlias алиас таблицы для $relationField
  * @param ICollection $relationCollection коллекция поля ПО которому осуществляется связь
  * @param ICollection $targetCollection коллекция НА которую осуществляется связь
  * @return $this
  */
 protected function applyJoinForManyToManyRelation(ISelectBuilder $selectBuilder, ManyToManyRelationField $relationField, $relationSourceAlias, ICollection $relationCollection, ICollection $targetCollection)
 {
     $targetTableName = $targetCollection->getMetadata()->getCollectionDataSource()->getSourceName();
     $targetTableAlias = $relationSourceAlias . self::ALIAS_SEPARATOR . $relationField->getName();
     $targetPk = $targetCollection->getIdentifyField();
     $relationPk = $relationCollection->getIdentifyField();
     $metadata = $this->getMetadataManager()->getMetadata($relationField->getBridgeCollectionName());
     $bridgeTableName = $metadata->getCollectionDataSource()->getSourceName();
     $bridgeTableAlias = $targetTableAlias . self::BRIDGE_ALIAS_POSTFIX;
     $bridgeRelationFieldName = $relationField->getRelatedFieldName();
     $bridgeRelationField = $metadata->getField($bridgeRelationFieldName);
     $bridgeTargetFieldName = $relationField->getTargetFieldName();
     $bridgeTargetField = $metadata->getField($bridgeTargetFieldName);
     // JOIN bridge collection
     $leftColumn = $bridgeTableAlias . self::FIELD_SEPARATOR . $bridgeRelationField->getColumnName();
     $rightColumn = $relationSourceAlias . self::FIELD_SEPARATOR . $relationPk->getColumnName();
     $selectBuilder->leftJoin(array($bridgeTableName, $bridgeTableAlias))->on($leftColumn, '=', $rightColumn);
     // JOIN target collection
     $leftColumn = $targetTableAlias . self::FIELD_SEPARATOR . $targetPk->getColumnName();
     $rightColumn = $bridgeTableAlias . self::FIELD_SEPARATOR . $bridgeTargetField->getColumnName();
     $selectBuilder->leftJoin(array($targetTableName, $targetTableAlias))->on($leftColumn, '=', $rightColumn);
     return $this;
 }