将实体ID设置为其他实体的函数

时间:2014-12-19 15:27:39

标签: symfony orm doctrine entity relationship

我使用的是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;

我该如何解决?先谢谢你。

1 个答案:

答案 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列,然后使用它。