В защиту моего вопроса, вот несколько ссылок, на которые я смотрел перед публикацией.
Symfony Doctrine ошибка обновления запроса
Doctrine Не является действительным объектом или сопоставленным суперклассом
Как исправить класс, не является действительным объектом или сопоставленным суперклассом?
И было больше чем полдюжины, которые я не перечисляю. Сообщение об ошибке, что я получаю это.
[18-Apr-2020 12:30:50 America/New_York] PHP Fatal error: Uncaught Doctrine\ORM\Mapping\MappingException: Class "Doctrine\ORM\QueryBuilder" is not a valid entity or mapped super class. in C:\oerm_dev\www\dev\future5_2\vendor\doctrine\orm\lib\Doctrine\ORM\Mapping\MappingException.php:346
Stack trace:
#0 C:\oerm_dev\www\dev\future5_2\vendor\doctrine\orm\lib\Doctrine\ORM\Mapping\Driver\AnnotationDriver.php(93): Doctrine\ORM\Mapping\MappingException::classIsNotAValidEntityOrMappedSuperClass('Doctrine\\ORM\\Qu...')
#1 C:\oerm_dev\www\dev\future5_2\vendor\doctrine\orm\lib\Doctrine\ORM\Mapping\ClassMetadataFactory.php(151): Doctrine\ORM\Mapping\Driver\AnnotationDriver->loadMetadataForClass('Doctrine\\ORM\\Qu...', Object(Doctrine\ORM\Mapping\ClassMetadata))
#2 C:\oerm_dev\www\dev\future5_2\vendor\doctrine\common\lib\Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory.php(332): Doctrine\ORM\Mapping\ClassMetadataFactory->doLoadMetadata(Object(Doctrine\ORM\Mapping\ClassMetadata), NULL, false, Array)
#3 C:\oerm_dev\www\dev\future5_2\vendor\doctrine\orm\lib\Doctrine in C:\oerm_dev\www\dev\future5_2\vendor\doctrine\orm\lib\Doctrine\ORM\Mapping\MappingException.php on line 346
При устранении неполадок кода я знаю, что это эта строка.
$this->_em->persist($qb);
Я знаю, что это эта строка, потому что, если я закомментирую эту строку и строку под ней, код будет проходить без дополнительных ошибок. Однако ничего не сохраняется. Я перечитал
https://www.doctrine-project.org/projects/doctrine-phpcr-odm/en/latest/reference/query-builder.html#the -querybuilder
Хотя есть много информации, получающей данные, но мало что написано об UPDATE.
https://symfony.com/doc/current/doctrine.html#updating -an-object
Теперь вот код
namespace OpenEMR\Repositories;
use Doctrine\ORM\EntityRepository;
use OpenEMR\Entities\FormEncounter;
class FormEncounterRepository extends EntityRepository
{
/**
* @param FormEncounter
* @param $message
* @return $response
*/
public function update($message)
{
$response = false;
$enc = $_SESSION['encounter'];
try {
$qb = $this->_em->getRepository($this->_entityName)->createQueryBuilder('fe');
$qb->update(FormEncounter::class)
->set('fe.reason', 'text')
->where('fe.encounter', 'num')
->setParameter('text', $message)
->setParameter('num', $enc)
->getQuery();
$this->_em->persist($qb);
$this->_em->flush();
$response = true;
} catch (Exception $e) {
return 'An Error occured during save: ' .$e->getMessage();
}
return $response;
}
}
Мой вопрос: почему выдается эта ошибка? У меня есть код очень близко к этому использует команду вставки, и это работает. Основное различие между ними состоит в том, что выбор использует функцию Query :: HYDRATE_ARRAY.
Хорошо, я понял. Это была некоторая информация, с которой я не столкнулся. Я делал это неправильно.
Однако документация https://symfony.com/doc/current/doctrine.html#updating -an-object не говорит вам, что они сохраняются, потому что. Теперь, чтобы остановить мое нытье.
Я вернулся и изменил код контроллера, думая, что, как было сказано, сохраняется там, а не в репозитории. Я добавил функцию. Вот код моего контроллера.
/**
* @param $message
*/
public function addAddendum(FormEncounter $message)
{
//get current encounter
$enc = $GLOBALS['encounter'];
$reason = $this->repository;
//get reason from database
$getReason = $reason->findOneBy(['encounter' => $enc]);
$this->updatedReason = $getReason->getReason() ."\r\n ADENDUM: \r\n". $message;
self::updateReason($this->updateReason());
return "Finished";
}
/**
* @param \OpenEMR\Entities\FormEncounter $reason
*/
private function updateReason(FormEncounter $reason)
{
try {
//get current encounter
$enc = $GLOBALS['encounter'];
$aReason = $this->repository;
$findReason = $aReason->findOneBy(['encounter' => $enc]);
$this->save = $findReason->setReason($reason);
$this->entityManager->persist($this->save);
$this->entityManager->flush();
} catch (Exception $e) {
}
}
Теперь у меня новая ошибка, которую я не могу выяснить.
[18-Apr-2020 20:33:17 America/New_York] PHP Fatal error: Uncaught Error: Call to a member function persist() on null in C:\oerm_dev\www\dev\future5_2\src\Events\Addendum\AddendumEsign.php:71
Stack trace:
#0 C:\oerm_dev\www\dev\future5_2\src\Events\Addendum\AddendumEsign.php(54): OpenEMR\Events\Addendum\AddendumEsign->updateReason('Test Ribbon, no...')
#1 C:\oerm_dev\www\dev\future5_2\src\Events\Addendum\addendum_esign_helper.php(38): OpenEMR\Events\Addendum\AddendumEsign->addAddendum('This is a test ...')
#2 {main}
thrown in C:\oerm_dev\www\dev\future5_2\src\Events\Addendum\AddendumEsign.php on line 71
Итак, проверьте мою логику c. $ findReason вызывает базу данных, чтобы узнать причину, по которой я ищу обновление. По нахождению той причины, которую я хочу обновить. $ this-> save = $ findReason-> setReason ($ reason) должен сохранить новый объект причины, который был передан из метода addAddendum (). Ошибка говорит мне, что строка 71 пуста, когда я знаю, что передал ей объект $ reason.