Doctrine orm Doctrine2多个插入
我将Zend Framework 2与Doctrine2一起使用。 我有两个具有多对多关系的实体:项目和用户。 条令创建了一个表users\u projects,其中包含project\u id和user\u id字段,因为每个项目可以有多个用户,每个用户可以有多个项目。 现在,当我添加一个项目时,我想向该项目添加多个用户。 那么,我如何在表用户\项目中插入数据呢 项目Doctrine orm Doctrine2多个插入,doctrine-orm,zend-framework2,many-to-many,insert-update,Doctrine Orm,Zend Framework2,Many To Many,Insert Update,我将Zend Framework 2与Doctrine2一起使用。 我有两个具有多对多关系的实体:项目和用户。 条令创建了一个表users\u projects,其中包含project\u id和user\u id字段,因为每个项目可以有多个用户,每个用户可以有多个项目。 现在,当我添加一个项目时,我想向该项目添加多个用户。 那么,我如何在表用户\项目中插入数据呢 项目 class Project { /** * @ORM\Id * @ORM\GeneratedValue(strategy="A
class Project {
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer", unique=TRUE)
*/
protected $id;
/**
* @ORM\ManyToMany(targetEntity="User", mappedBy="projects")
*/
protected $users;
public function __construct()
{
$this->users = new \Doctrine\Common\Collections\ArrayCollection();
}
use Doctrine\Common\Collections\ArrayCollection;
/**
* @ORM\Entity
*/
class Project
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @var int
*/
protected $id;
/**
* @ORM\ManyToMany(targetEntity="User", mappedBy="projects")
* @var ArrayCollection
*/
protected $users;
public function __construct()
{
$this->users = new ArrayCollection();
}
/**
* @param User $user
*/
public function addUser(User $user)
{
if (!$this->users->contains($user)) {
$this->users->add($user);
$user->addProject($this);
}
}
/**
* @param User $user
*/
public function removeUser(User $user)
{
if ($this->users->contains($user)) {
$this->users->removeElement($user);
$user->removeProject($this);
}
}
/**
* @return User[]
*/
public function getUsers()
{
return $this->users->toArray();
}
// ...
}
用户
class User {
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer", unique=TRUE)
*/
protected $id;
/**
* @ORM\ManyToMany(targetEntity="Project", inversedBy="users")
* @ORM\JoinTable(name="users_projects")
*/
protected $projects;
public function __construct()
{
$this->projects = new \Doctrine\Common\Collections\ArrayCollection();
}
use Doctrine\Common\Collections\ArrayCollection;
/**
* @ORM\Entity
*/
class User
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @var int
*/
protected $id;
/**
* @ORM\ManyToMany(targetEntity="Project", inversedBy="users")
* @ORM\JoinTable(name="users_projects")
* @var ArrayCollection
*/
protected $projects;
public function __construct()
{
$this->projects = new ArrayCollection();
}
/**
* @param Project $project
*/
public function addProject(Project $project)
{
if (!$this->projects->contains($project)) {
$this->projects->add($project);
$project->addUser($this);
}
}
/**
* @param Project $project
*/
public function removeProject(Project $project)
{
if ($this->projects->contains($project)) {
$this->projects->removeElement($project);
$project->removeUser($this);
}
}
/**
* @return Project[]
*/
public function getProjects()
{
return $this->projects->toArray();
}
// ...
}
该关系是一个
ArrayCollection
,您需要将对象添加到此集合中。
如下所示:
$project = new Project;
$project->title = 'Foo';
// Create new user
$user = new User;
$user->name = 'Bar';
$user->getProjects()->add($project);
$em->persist($user);
// ..or add to existing user
$existingUser = $userRepo->findById(1);
$existingUser->getProjects()->add($project);
$em->persist($existingUser);
$project->getUsers()->add($user);
$em->persist($project);
$em->flush();
那么,我如何在表用户\项目中插入数据呢
你不知道;)
引用文件:
初学者的一个常见错误是将DQL误认为只是某种形式的SQL,因此试图在查询中使用表名和列名或将任意表连接在一起。您需要将DQL看作是对象模型的查询语言,而不是关系模式的查询语言
在您的例子中,您不需要担心users\u projects
表,因为您没有对象(实体)。您只有项目
和用户
实体,因此您只需将它们彼此附加。关心联接表是条令的工作
下面是一个很好的方法:
项目
class Project {
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer", unique=TRUE)
*/
protected $id;
/**
* @ORM\ManyToMany(targetEntity="User", mappedBy="projects")
*/
protected $users;
public function __construct()
{
$this->users = new \Doctrine\Common\Collections\ArrayCollection();
}
use Doctrine\Common\Collections\ArrayCollection;
/**
* @ORM\Entity
*/
class Project
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @var int
*/
protected $id;
/**
* @ORM\ManyToMany(targetEntity="User", mappedBy="projects")
* @var ArrayCollection
*/
protected $users;
public function __construct()
{
$this->users = new ArrayCollection();
}
/**
* @param User $user
*/
public function addUser(User $user)
{
if (!$this->users->contains($user)) {
$this->users->add($user);
$user->addProject($this);
}
}
/**
* @param User $user
*/
public function removeUser(User $user)
{
if ($this->users->contains($user)) {
$this->users->removeElement($user);
$user->removeProject($this);
}
}
/**
* @return User[]
*/
public function getUsers()
{
return $this->users->toArray();
}
// ...
}
用户
class User {
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer", unique=TRUE)
*/
protected $id;
/**
* @ORM\ManyToMany(targetEntity="Project", inversedBy="users")
* @ORM\JoinTable(name="users_projects")
*/
protected $projects;
public function __construct()
{
$this->projects = new \Doctrine\Common\Collections\ArrayCollection();
}
use Doctrine\Common\Collections\ArrayCollection;
/**
* @ORM\Entity
*/
class User
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @var int
*/
protected $id;
/**
* @ORM\ManyToMany(targetEntity="Project", inversedBy="users")
* @ORM\JoinTable(name="users_projects")
* @var ArrayCollection
*/
protected $projects;
public function __construct()
{
$this->projects = new ArrayCollection();
}
/**
* @param Project $project
*/
public function addProject(Project $project)
{
if (!$this->projects->contains($project)) {
$this->projects->add($project);
$project->addUser($this);
}
}
/**
* @param Project $project
*/
public function removeProject(Project $project)
{
if ($this->projects->contains($project)) {
$this->projects->removeElement($project);
$project->removeUser($this);
}
}
/**
* @return Project[]
*/
public function getProjects()
{
return $this->projects->toArray();
}
// ...
}
请注意,Project::getUsers()
和User::getProjects()
不返回集合本身,而是返回一个普通的PHP数组。这将确保实体完全控制向这些集合添加/删除的内容
其次,您将看到Project::addUser()
不仅将用户添加到其集合中,而且该用户还将该项目添加到其集合中。这对于双向关联非常重要!双方需要达成一致,否则会发生奇怪的事情
这也适用于从集合中删除
注意:contains()
检查添加/删除将确保您不会陷入无限循环;)
处理此问题
// user-table has 0 rows, project-table has 0 rows, join-table has 0 rows
$user = new User();
$project = new Project();
$em->persist($user);
$em->persist($project);
$em->flush();
// user-table has 1 row, project-table has 1 row, join-table has 0 rows
$project->addUser($user);
$em->flush();
// user-table has 1 row, project-table has 1 row, join-table has 1 row
$secondProject = new Project();
$secondProject->addUser($user);
$em->persist($secondProject);
$em->flush();
// user-table has 1 row, project-table has 2 rows, join-table has 2 rows
$user->removeProject($project);
$em->flush();
// user-table has 1 row, project-table has 2 rows, join-table has 1 rows