예제 #1
0
파일: HasOne.php 프로젝트: vlucas/spot2
 /**
  * Save related entities
  *
  * @param EntityInterface $entity Entity to save relation from
  * @param string $relationName Name of the relation to save
  * @param array $options Options to pass to the mappers
  * @return boolean
  */
 public function save(EntityInterface $entity, $relationName, $options = [])
 {
     $lastResult = false;
     $relatedEntity = $entity->relation($relationName);
     $relatedMapper = $this->mapper()->getMapper($this->entityName());
     //Autoloaded relation, no need to save
     if ($relatedEntity instanceof HasOne) {
         return 0;
     }
     if ($relatedEntity === false || $relatedEntity->get($this->foreignKey()) !== $entity->primaryKey()) {
         if ($relatedMapper->entityManager()->fields()[$this->foreignKey()]['notnull']) {
             $relatedMapper->delete([$this->foreignKey() => $entity->primaryKey()]);
         } else {
             $relatedMapper->queryBuilder()->builder()->update($relatedMapper->table())->set($this->foreignKey(), null)->where([$this->foreignKey() => $entity->primaryKey()]);
         }
         if ($relatedEntity instanceof EntityInterface) {
             //Update the foreign key to match the main entity primary key
             $relatedEntity->set($this->foreignKey(), $entity->primaryKey());
         }
     }
     if ($relatedEntity instanceof EntityInterface && ($relatedEntity->isNew() || $relatedEntity->isModified())) {
         $lastResult = $relatedMapper->save($relatedEntity, $options);
     }
     return $lastResult;
 }
예제 #2
0
파일: HasMany.php 프로젝트: vlucas/spot2
 /**
  * Save related entities
  *
  * @param EntityInterface $entity Entity to save relation from
  * @param string $relationName Name of the relation to save
  * @param array $options Options to pass to the mappers
  * @return boolean
  */
 public function save(EntityInterface $entity, $relationName, $options = [])
 {
     $relatedEntities = $entity->relation($relationName);
     $deletedIds = [];
     $lastResult = false;
     $relatedMapper = $this->mapper()->getMapper($this->entityName());
     if (is_array($relatedEntities) || $relatedEntities instanceof Entity\Collection) {
         $oldEntities = $this->execute();
         $relatedIds = [];
         foreach ($relatedEntities as $related) {
             if ($related->isNew() || $related->isModified() || $related->get($this->foreignKey()) !== $entity->primaryKey()) {
                 //Update the foreign key to match the main entity primary key
                 $related->set($this->foreignKey(), $entity->primaryKey());
                 $lastResult = $relatedMapper->save($related, $options);
             }
             $relatedIds[] = $related->id;
         }
         foreach ($oldEntities as $oldRelatedEntity) {
             if (!in_array($oldRelatedEntity, $relatedIds)) {
                 $deletedIds[] = $oldRelatedEntity->primaryKey();
             }
         }
     }
     if (count($deletedIds) || $relatedEntities === false) {
         $conditions = [$this->foreignKey() => $entity->primaryKey()];
         if (count($deletedIds)) {
             $conditions[$this->localKey() . ' :in'] = $deletedIds;
         }
         if ($relatedMapper->entityManager()->fields()[$this->foreignKey()]['notnull']) {
             $relatedMapper->delete($conditions);
         } else {
             $relatedMapper->queryBuilder()->builder()->update($relatedMapper->table())->set($this->foreignKey(), null)->where($conditions);
         }
     }
     return $lastResult;
 }
예제 #3
0
 /**
  * Save related entities
  *
  * @param EntityInterface $entity Entity to save relation from
  * @param string $relationName Name of the relation to save
  * @param array $options Options to pass to the mappers
  * @return boolean
  */
 public function save(EntityInterface $entity, $relationName, $options = [])
 {
     $deletedIds = [];
     $lastResult = false;
     $relatedMapper = $this->mapper()->getMapper($this->entityName());
     $relatedEntities = $entity->relation($relationName);
     $oldEntities = $this->execute();
     if (is_array($relatedEntities) || $relatedEntities instanceof Entity\Collection) {
         $throughMapper = $this->mapper()->getMapper($this->throughEntityName());
         $relatedMapper = $this->mapper()->getMapper($this->entityName());
         $relatedIds = [];
         foreach ($relatedEntities as $related) {
             if ($related->isNew() || $related->isModified()) {
                 $lastResult = $relatedMapper->save($related, $options);
             }
             $relatedIds[] = $related->primaryKey();
             if (!count($throughMapper->where([$this->localKey() => $entity->primaryKey(), $this->foreignKey() => $related->primaryKey()]))) {
                 $lastResult = $throughMapper->create([$this->localKey() => $entity->primaryKey(), $this->foreignKey() => $related->primaryKey()]);
             }
         }
         $deletedIds = [];
         foreach ($oldEntities as $oldRelatedEntity) {
             if (!in_array($oldRelatedEntity->primaryKey(), $relatedIds)) {
                 $deletedIds[] = $oldRelatedEntity->primaryKey();
             }
         }
         if (!empty($deletedIds)) {
             $throughMapper->delete([$this->localKey() => $entity->primaryKey(), $this->foreignKey() . ' :in' => $deletedIds]);
         }
     } else {
         if ($relatedEntities === false) {
             //Relation was deleted, remove all
             $throughMapper = $this->mapper()->getMapper($this->throughEntityName());
             $throughMapper->delete([$this->localKey() => $entity->primaryKey()]);
         }
     }
     return $lastResult;
 }
예제 #4
0
파일: BelongsTo.php 프로젝트: vlucas/spot2
 /**
  * Save related entities
  *
  * @param ntityInterface $entity Entity to save relation from
  * @param string $relationName Name of the relation to save
  * @param array $options Options to pass to the mappers
  * @return boolean
  */
 public function save(EntityInterface $entity, $relationName, $options = [])
 {
     $lastResult = 0;
     $relatedEntity = $entity->relation($relationName);
     if ($relatedEntity instanceof EntityInterface) {
         if ($relatedEntity->isNew() || $relatedEntity->isModified()) {
             $relatedMapper = $this->mapper()->getMapper($this->entityName());
             $lastResult = $relatedMapper->save($relatedEntity, $options);
             //Update the local key to match the related entity primary key
             if ($entity->get($this->localKey()) !== $relatedEntity->primaryKey()) {
                 $relatedRelations = $entity->relations($relatedMapper, $relatedEntity);
                 //Check if it was a hasOne or a hasMany relation,
                 //if hasOne, we must unset old value
                 foreach ($relatedRelations as $relatedRelation) {
                     if ($relatedRelation instanceof Relation\HasOne && $relatedRelation->foreignKey() === $this->localKey()) {
                         if ($relatedMapper->entityManager()->fields()[$relatedRelation->foreignKey()]['notnull']) {
                             $lastResult = $relatedMapper->delete([$relatedRelation->foreignKey() => $entity->get($relatedRelation->foreignKey())]);
                         } else {
                             $lastResult = $relatedMapper->queryBuilder()->builder()->update($relatedMapper->table())->set($relatedRelation->foreignKey(), null)->where([$relatedRelation->foreignKey() => $entity->get($relatedRelation->foreignKey())]);
                         }
                     }
                 }
                 $entity->set($this->localKey(), $relatedEntity->primaryKey());
             }
         }
     }
     return $lastResult;
 }