【发布时间】:2011-10-28 14:07:23
【问题描述】:
FOSUserBundle 非常适合我正在进行的项目。但我正在尝试嵌入 FOSFacebookBundle 并使其与 FOSUserBundle 一起使用。
为此,我构建了自己的Acme\MyBundle\Entity\User.php,以添加一些我想从 Facebook 存储的字段,以及提供 UserBundle 的内容。这
此类的代码已经过调试并且可以正常工作(嗯...这就是我的想法!见下文)。
不起作用的是(在我的 Acme\MyBundle\Security\User\Provider\FacebookProvider.php 中,在 loadUserByUsername() 中)这一行:
$this->userManager->updateUser($user);
Acme\MyBundle\Security\User\Provider\FacebookProvider.php 与文档相同(read it here)
以下元素是print_r($user); 的输出,就在
$this->userManager->updateUser($user); 的执行:
消息错误是“未知错误”。所以我决定去看看这条消息在Bundle中的发送位置。而且我发现它被设置在一个异常中。我决定输出异常消息。
所以在异常消息下方:
通过关系发现了一个新实体 'Acme\MyBundle\Entity\User#languages' 未配置为 实体的级联持久化操作: Acme\MyBundle\Entity\SpokenLanguage@000000004a9e2dfa0000000001482b74。 显式持久化新实体或配置级联持久化 关系上的操作。如果您无法找出哪个实体 导致问题执行 'Acme\MyBundle\Entity\SpokenLanguage#__toString()' 来获得线索。
所以我想我的 User 类的 Doctrine Annotations 没有很好地编码,问题是 ManyToMany() 关联映射。
这里是我的 Acme\MyBundle\Entity\User.php 中 $languages 字段的注释:
/**
* @var \Doctrine\Common\Collections\ArrayCollection
* @ORM\ManyToMany(targetEntity="SpokenLanguage")
* @ORM\JoinTable(name="users_spokenlanguage",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="spokenlanguage_id", referencedColumnName="facebookID")}
* )
*/
protected $languages;
你们有什么办法解决这个问题吗? 我正在考虑一个级联问题。
谢谢大家。
【问题讨论】:
-
好的!我已经解决了这个问题...最后您必须将参数
cascade={'persist','remove','merge'}添加到Annotation ManyToMany。像这样:@ORM\ManyToMany(targetEntity="SpokenLanguage", cascade={"persist", "remove", "merge"}) -
请发表您的评论作为答案并接受它;)
标签: doctrine-orm symfony