예제 #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;
 }