我在使用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
为什么要这样做?我怎样才能得到我正在寻找的行为?
由于
答案 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类。