sbi*_*sbi 17 php mysql doctrine-orm
我有一个故事表和用户表.故事表中的列userid是一个外键,它引用用户表中的id.
我设置的关系是用户可能有很多故事存储在故事表中.我已经创建了两个表的实体.
但是如果尝试仅将操作持久化到故事表,则会询问新用户输入的详细信息.
我的目标是添加一个现有的新故事userId.
我在这里发布错误:
通过关系"Story#_userId"找到了一个新实体,该关系未配置为对实体进行级联持久操作:User @ 0000000038960c50000000008ea93852.要解决此问题:在此未知实体上显式调用EntityManager#persist()或在映射中配置级联持久保存此关联,例如@ManyToOne(..,cascade = {\"persist \"}).
我在Story实体中设置了ManyToOne关系:
/**
* @ManyToOne(targetEntity="User", inversedBy = "_story" )
* @JoinColumns({
* @JoinColumn(name="user_id", referencedColumnName="id")
* })
*/
private $_userId;
Run Code Online (Sandbox Code Playgroud)
我检查了数据库架构,它显示了关系设置正确.所以我完成了故事插入过程.
$user = new User();
$user->setUserId($id);
$story = new Story();
$story->setContent("....");
$story->setUserid($user);
$this->em->persist($story);
$this->em->flush();
Run Code Online (Sandbox Code Playgroud)
K. *_*ert 24
您可能是故事实体而不是用户.如果您有这样的事情:
$story = new Story();
$user = new User();
$story->setUser($user);
$em->persist($story);
$em->flush();
Run Code Online (Sandbox Code Playgroud)
这将导致致命错误,因为您持久化一个实体,但通过其关系,Doctrine找到另一个新实体.您有两种选择:
呼叫持续存在于两个实体上:
$story = new Story();
$user = new User();
$story->setUser($user);
$em->persist($story);
$em->persist($user);
$em->flush();
Run Code Online (Sandbox Code Playgroud)
或者,为Story实体设置级联持久性.例如.如果你正在使用注释映射,你会做类似的事情
/**
* @ManyToOne(targetEntity="User", inversedBy="stories", cascade={"persist"})
*/
private $author;
Run Code Online (Sandbox Code Playgroud)
K. Norbert的答案就在现场,但是有些事情可能还不清楚。至少对于我来说不清楚,谁是SQL的理论家。
事情是学说似乎记得哪些对象已经存在。每当发现与您要保留的实体相关的新对象(尚未保留)时,都会大喊“通过关系找到新实体...”错误。当您要保存新对象(仅一个实体,不保留相关实体)时,只需确保相关实体已被持久保存。所以:
$story = new Story();
$entityManager->find('User', $id);
$story->setUser($user);
$em->persist($story);
$em->flush();
Run Code Online (Sandbox Code Playgroud)
绝招。因为主义知道用户已经被坚持了,所以不再需要这样做了。教义之所以知道,是因为我们从数据库中获得了用户。
我正在努力了解您的需求,所以我不确定这是否能回答您的问题。
由于story.user_id id是user.id的外键(它是主键),因此不能为空/空。因此,如果您有一个 php 会话,您可能应该将您的用户 id(或用户名)存储在会话变量中,并且当您在故事表中创建新记录时,使用会话中的用户 id 来填充Story.user_id 属性。
希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
29022 次 |
| 最近记录: |