我正在编写一个模块来重置我的用户密码。我有一个从LoginHash实体到我的用户实体的ManyToOne关系。
/**
* @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();
}
这导致异常;
实体Doctrine \ ORM \ EntityManager @ 00000000113b253c000000003f7b1f80未受管理。如果实体从数据库中获取或通过EntityManager#persist注册为> new,则对其进行管理 500内部服务器错误 - ORMInvalidArgumentException
我迷路了。我使用单个Entity Managed注入到onSuccess(Request $request)
方法所在的同一个类中。而且我不应该坚持这些对象,因为它们首先是从管理器中检索出来的吗?即使我打电话persist($user)
,也会抛出此异常。
如果我将flush($login_hash)
实体作为参数传入,最后我设法$login_hash
到数据库。这导致login_hash表中的行得到更新,但不会更新用户表。
我在这里缺少什么?
编辑:
var_dumped 00000000113b253c000000003f7b1f80字符串,实际上是对整个EntityManager对象的引用。
-unitOfWork: UnitOfWork {#288 ▼
-identityMap: array:2 [▼
"AppBundle\Entity\LoginHash" => array:1 [▶]
"AppBundle\Entity\User" => array:1 [▶]
答案 0 :(得分:0)
你的实体必须有这样的东西:
public function __construct()
{
$this->user= new ArrayCollection;
}
public function setUser($user)
{
$this->user[]=$user;
}
另外,不要忘记在刷新之前坚持