public function testUpdatePKValue() { /** @var Client $client */ $client = $this->em->getRepository($this->clientFullClassName)->find(1); $this->assertEquals(1, $client->getId()); EntityHelper::changePKValue($this->em, $client, 10); $this->assertEquals(10, $client->getId()); }
/** * [ВНИМАНИЕ] * Если у сущности генератор первичного ключа отсутствует, т.е. необходимо задать вручную ключ, то необходимо удалить * первичный ключ из структуры, чтобы не было попыток найти эту сущность. Ошибка описана в ссылке ниже * @link https://github.com/jamesmoey/extjs-bundle/issues/17 * @inheritdoc */ public function run() { $this->checkIsInit(); $obj = json_decode($this->requestContent, false, 512, JSON_BIGINT_AS_STRING); $response = new RestResponse(); $savedPKValueFromRequestData = null; $PKFieldName = $this->getPKFieldName(); $entityNotHaveIdGenerator = $this->classMetadata->generatorType == ClassMetadata::GENERATOR_TYPE_NONE; if ($entityNotHaveIdGenerator) { if (!$this->isObjectHasPKField($obj) && !$this->isObjectHasNewPKField($obj)) { $response->setSuccess(false)->setStatusCode(RestResponse::STATUS_CODE_WRONG_INPUT_DATA)->setMessage(sprintf("Не указан первичный ключ (%s)", $PKFieldName)); return $response; } elseif (!$this->isObjectHasPKField($obj) && $this->isObjectHasNewPKField($obj)) { $savedPKValueFromRequestData = $this->getNewPKValueFromObject($obj); unset($obj->{$this->getNewPKValueFromObject($obj)}); } elseif ($this->isObjectHasPKField($obj) && !$this->isObjectHasNewPKField($obj)) { $savedPKValueFromRequestData = $obj->{$PKFieldName}; unset($obj->{$PKFieldName}); } } $serializedObj = json_encode($obj); $entity = $this->serializer->deserialize($serializedObj, $this->classMetadata->getName(), 'json', DeserializationContext::create()->setGroups([Action::GROUP_DEFAULT, Action::GROUP_POST])); if ($entityNotHaveIdGenerator) { EntityHelper::changePKValue($this->em, $entity, $savedPKValueFromRequestData); } $validator = $this->validator; /** @var ConstraintViolationList $validations */ $validations = $validator->validate($entity); if (sizeof($validations) === 0) { try { $this->em->persist($entity); $this->em->flush(); $this->em->refresh($entity); $response->setSuccess(true)->setData($entity)->setStatusCode(RestResponse::STATUS_CODE_OK); } catch (DBALException $e) { $response->setSuccess(false)->setMessage($e->getMessage())->setStatusCode(RestResponse::STATUS_CODE_WRONG_INPUT_DATA); } } else { $response->setSuccess(false)->setStatusCode(RestResponse::STATUS_CODE_WRONG_INPUT_DATA)->setErrors($validations); } return $response; }
/** * * @param Object $content Обработанные данные из запроса * @return mixed */ protected function mergeDataFromRequestWithEntity($content) { $dContext = DeserializationContext::create()->setGroups($this->serializationContextGroups); $dContext->attributes->set('related_action', 'merge'); $entity = $this->serializer->deserialize(json_encode($content), $this->classMetadata->getName(), 'json', $dContext); if ($this->newPrimaryKeyValue !== null) { EntityHelper::changePKValue($this->em, $entity, $this->newPrimaryKeyValue); } return $entity; }