Я пишу модуль для сброса пароля пользователя. У меня есть отношение ManyToOne от моей сущности LoginHash к моей сущности User.
/**
* @ORM\Entity()
* @ORM\Table(name="login_hash")
*/
class LoginHash
{
//properties
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\User")
* @ORM\JoinColumn(onDelete="CASCADE")
*/
private $user;
// constructor (takes AppBundle\Entity\User as argument)
// getters and setters
}
Когда пользователь запрашивает сброс пароля, я выбираю пользователя, который соответствует данному хешу. Затем я изменяю объект User и пытаюсь сбросить его в базу данных.
public function onSuccess(Request $request)
{
$login_hash = $this->em->getRepository(LoginHash::class)->findOneBy(['hash' => $this->hash]);
$user = $login_hash->getUser();
$user->setPlainPassword($this->data->getPlainPassword());
$login_hash->increaseTimesUsed();
$this->em->flush();
}
Это приводит к исключению;
Entity Doctrine \ ORM \ EntityManager @ 00000000113b253c000000003f7b1f80 не> управляем. Сущность управляется, если она получена из базы данных или зарегистрирована как> новая через EntityManager # persist 500 Internal Server Error - ORMInvalidArgumentException
Я потерян. Я использую один объект Entity Managed, введенный в тот же класс, где находится метод onSuccess(Request $request)
. И мне не нужно сохранять объекты, поскольку они в первую очередь извлекаются из диспетчера, верно? Даже когда я вызываю persist($user)
, возникает это исключение.
Наконец, мне удается flush($login_hash)
в базу данных, если я передаю сущность $login_hash
в качестве аргумента. Это приводит к тому, что обновляются строки в таблице login_hash, но не в таблице user.
Что мне здесь не хватает?
Редактировать:
var_dump скопировал строку 00000000113b253c000000003f7b1f80, которая фактически является ссылкой на весь объект EntityManager.
-unitOfWork: UnitOfWork {#288 ▼
-identityMap: array:2 [▼
"AppBundle\Entity\LoginHash" => array:1 [▶]
"AppBundle\Entity\User" => array:1 [▶]