我使用的是FOFUserBundle。每当用户注册时,它都会在数据库中创建一个新条目。出于扩展目的,我想要另一个表来保存该用户的Id和用户名。后来我用它来创建slu and和其他功能。
我实现了一个Listener,以便在用户成功注册后获得确认,然后将数据传输到Author Entity。只要传递$ name字段,如果在AUhor实体中将@Id生成策略设置为Auto,它就会起作用。但是我在显示的设置中出现以下错误:
"" Vlag \ ModelBundle \ Entity \ Author类型的实体缺少字段' author_id'的已分配ID。此实体的标识符生成策略要求在调用EntityManager#persist()之前填充ID字段。如果您想要自动生成标识符,则需要相应地调整元数据映射。""
以下是涉及的文件:
监听器:
namespace Vlag\CoreBundle\EventListener;
use Doctrine\ORM\EntityManager;
use FOS\UserBundle\Event\FormEvent;
use FOS\UserBundle\FOSUserEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Vlag\ModelBundle\Entity\Author;
use FOS\UserBundle\Event\FilterUserResponseEvent;
use Users\UserBundle\Entity\User;
class MyUserRegistrationListener extends FilterUserResponseEvent implements EventSubscriberInterface
{
private $em;
public function __construct(EntityManager $em)
{
$this->em = $em;
}
public static function getSubscribedEvents()
{
return array(
FOSUserEvents::REGISTRATION_COMPLETED => 'addAuthor',
);
}
public function addAuthor(FilterUserResponseEvent $event)
{
$user = $event->getUser();
$author = new Author();
$author->setName($user->getUsername());
$author->setAuthor_Id($user->getId());
$this->em->persist($author);
$this->em->flush();
}
}
user.php的
/**
* @ORM\Entity
* @ORM\Table(name="fos_user")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*
* @ORM\OneToOne(
* targetEntity="Author",
* mappedBy="author_id")
*/
protected $id;
seters and getters ....
Author.php
**
* Author
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Vlag\ModelBundle\Repository\AuthorRepository")
*/
class Author extends Timestampable
{
/**
* @var integer
*
* @ORM\Column(name="author_id", type="integer")
* @ORM\Id
*
* @ORM\OneToOne(
* targetEntity="User",
* inversedBy="id")
* @ORM\JoinColumn(
* name="author_id",
* referencedColumnName="id")
*/
private $author_id;
我该如何解决?先谢谢你。
答案 0 :(得分:1)
您的用户主键不应该有OneToOne。它应该是一个单独的$ author变量:
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\OneToOne(targetEntity="Author")
* @JoinColumn(name="author_id", referencedColumnName="id")
**/
private $author;
}
如果您保持单向并且只是通过用户实体访问作者,则更容易管理,但如果您希望它是双向的,您可以将其添加到作者实体:
class Author
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToOne(targetEntity="User", mappedBy="author")
*/
private $user;
}
您正在尝试确保用户和作者具有完全相同的ID /主键,并且对于OneToOne关系而言,这不是必需的。确保您的用户表上有author_id
列,然后使用它。