主义多对一的关系坚持运作

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)

8.与协会合作详细说明了这一点.

  • 对我来说同样的问题.我的用户实体来自结果缓存查询,因此是DETACHED.我想在没有合并用户的情况下创建新的故事来进行管理.这基本上也是Sujith所要求的.有没有类似"cascade = {ignore}"参数的东西? (4认同)

Bar*_*oży 5

K. Norbert的答案就在现场,但是有些事情可能还不清楚。至少对于我来说不清楚,谁是SQL的理论家。

事情是学说似乎记得哪些对象已经存在。每当发现与您要保留的实体相关的对象(尚未保留)时,都会大喊“通过关系找到新实体...”错误。当您要保存新对象(仅一个实体,不保留相关实体)时,只需确保相关实体已被持久保存。所以:

$story = new Story();
$entityManager->find('User', $id);
$story->setUser($user);
$em->persist($story);
$em->flush();
Run Code Online (Sandbox Code Playgroud)

绝招。因为主义知道用户已经被坚持了,所以不再需要这样做了。教义之所以知道,是因为我们从数据库中获得了用户。

  • 我仍然遇到错误“通过关系找到了新实体”,即使发现的用户已存储在数据库中,因为该实体找到了它:( (2认同)

oph*_*tor 0

我正在努力了解您的需求,所以我不确定这是否能回答您的问题。

由于story.user_id id是user.id的外键(它是主键),因此不能为空/空。因此,如果您有一个 php 会话,您可能应该将您的用户 id(或用户名)存储在会话变量中,并且当您在故事表中创建新记录时,使用会话中的用户 id 来填充Story.user_id 属性。

希望能帮助到你。