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


Doctrine 2: Cannot associate an existing entity object with a new entity object

我在Doctrine 2方面遇到了一些问题-我有一个预先存在的实体,名为Site,其中包含数据(即具有一些行的表),该实体与一个名为User的实体具有oneToMany关系。

我的User实体与Site具有manyToOne关系。

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

// 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

它为什么要这样做,我如何才能得到我想要的行为?

感谢

尝试使用这个:

$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类。