原则2:无法将现有实体对象与新实体对象相关联

时间:2013-07-16 17:15:31

标签: php doctrine-orm

我在使用Doctrine 2时遇到了一些麻烦 - 我有一个名为Site的预先存在的实体,其中包含数据(即包含某些行的表),其关系为oneToMany使用名为User的实体。

我的User实体与manyToOne的关系Site

创建新用户实体时,我想将其链接到特定网站。我的代码如下:

// create entity manager instance
$em = \Doctrine\ORM\EntityManager::create($connection, $config);

// get the site ID entry i'd like to insert into this user
$site = $em->createQuery('SELECT s FROM Entity\Site s WHERE s.name = ?1')->setParameter(1, 'My Site')->getResult();

// create new user
$obj = new \Entity\User;

// associate user with site
$obj->setJoiningSite($site[0]);

$em->persist($obj);
$em->flush();
$em->clear();

现在我的问题:多次运行此代码段会导致为每个新用户实体创建一个新的网站实体,即它不使用单个现有网站,而是每次都创建一个新网站实体。

以下是我的YAML文件的相关部分。第一站点:

Entity\Site:
    type: entity
    table: sites
    id:
        id:
            type: integer
            generator:
                strategy: AUTO
    fields:
        name:
            type: string
            length: 100
    oneToMany:
        users:
            targetEntity: Entity\User
            mappedBy: site

这是User

Entity\User:
    type: entity
    table: users
    id:
        id:
            type: integer
            generator:
                strategy: AUTO
    fields:
        username:
            type: string
            length: 20
    manyToOne:
        joining_site:
            targetEntity: Entity\Site
            mappedBy: users
            cascade: ["persist"]
            joinColumn:
                name: join_site_id
                referencedColumnName: id

为什么要这样做?我怎样才能得到我正在寻找的行为?

由于

1 个答案:

答案 0 :(得分:1)

尝试使用:

$site = $em->getRepository('Entity\User')->findOneBy(array('name' => [name_of_site]));
$user = new Entity\User();
$user->setJoiningSite($site);
$em->persist($user);
$em->flush();

和你的方法是这样的:

public function setJoiningSite($site) {
    $this->site = $site;
}

您必须将站点属性声明为Entity \ Site类。