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;
}