Doctrine orm Doctrine2多个插入

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

我将Zend Framework 2与Doctrine2一起使用。 我有两个具有多对多关系的实体:项目和用户。 条令创建了一个表users\u projects,其中包含project\u id和user\u id字段,因为每个项目可以有多个用户,每个用户可以有多个项目。 现在,当我添加一个项目时,我想向该项目添加多个用户。 那么,我如何在表用户\项目中插入数据呢

项目

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