Php 条令+;Zend Framework 2:在多对多关系中插入数据数组

Php 条令+;Zend Framework 2:在多对多关系中插入数据数组,php,orm,doctrine-orm,zend-framework2,Php,Orm,Doctrine Orm,Zend Framework2,我有一个Zend Framework2和Doctrine2作为ORM的应用程序。 我有一个名为用户的实体: namespace Adm\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="user") */ class User{ /** * @ORM\Id * @ORM\Column(type="integer"); * @ORM\Genera

我有一个Zend Framework2和Doctrine2作为ORM的应用程序。 我有一个名为用户的实体:

namespace Adm\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="user")
 */
class User{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer");
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string")
     */
    protected $name;

    /**
     * @ORM\Column(type="string")
     */
    protected $email;

    /**
     * @ORM\Column(type="string")
     */
    protected $password;

    /**
     * @ORM\ManyToMany(targetEntity="Module")
     * @ORM\JoinTable(
     *  name="user_module",
     *  joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
     *  inverseJoinColumns={@ORM\JoinColumn(name="module_id", referencedColumnName="id")}
     * )
     */
    protected $modules;

    public function __construct() {
        $this->modules = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * @return the $id
     */
public function getId() {
    return $this->id;
}

/**
 * @return the $name
 */
public function getName() {
    return $this->name;
}

/**
 * @return the $email
 */
public function getEmail() {
    return $this->email;
}

/**
 * @return the $password
 */
public function getPassword() {
    return $this->password;
}

/**
 * @param field_type $id
 */
public function setId($id) {
    $this->id = $id;
}

/**
 * @param field_type $name
 */
public function setName($name) {
    $this->name = $name;
}

/**
 * @param field_type $email
 */
public function setEmail($email) {
    $this->email = $email;
}

/**
 * @param field_type $password
 */
public function setPassword($password) {
    $this->password = $password;
}

/**
 * Add module
 *
 * @param dm\Entity\Module
 * @return User
 */
public function addModules(Module $modules = null){
    $this->modules[] = $modules;
}

/**
 * Get modules
 *
 * @return \Doctrine\Common\Collections\Collection
 */
public function getModules(){
    return $this->modules;
}

}
请参阅modules属性是一个多对多关系,它与一个名为user\u modules的表有关。 我还有实体模块:

namespace Adm\Entity;

use Doctrine\ORM\Mapping as ORM;
class Module{
/**
 * @ORM\Id
 * @ORM\Column(type="integer");
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @ORM\Column(type="string")
 */
private $name;

/**
 * @ORM\Column(type="integer")
 */
private $status;

/**
 * @return the $id
 */
public function getId() {
    return $this->id;
}

/**
 * @return the $name
 */
public function getName() {
    return $this->name;
}

/**
 * @return the $status
 */
public function getStatus() {
    return $this->status;
}

/**
 * @param field_type $id
 */
public function setId($id) {
    $this->id = $id;
}

/**
 * @param field_type $name
 */
public function setName($name) {
    $this->name = $name;
}

/**
 * @param field_type $status
 */
public function setStatus($status) {
    $this->status = $status;
}

}
我收到一个数组变量,其中包含表单中要插入到表中的Post。正如预期的那样,每个post元素在实体中都有它的属性。总之,我有一个$module变量,它是一个包含模块id的数组。我的问题是:如何将这些数据插入到user_module表中? 我的添加功能是:

public function addUser($newUser){
        $user = new User();
        $user->setName($newUser['name']);
        ...
        $this->getEm()->persist($user);
        $this->getEm()->flush();
    }

您应该阅读有关使用级联的内容。这将允许您保存/修改/删除关联的关系,以及您预期的工作方式

在这种情况下,您希望关系保持为
,因为您希望在保存用户本身时保存关联的实体

@ORM\manytomy(targetEntity=“Module”,cascade={“persist”})

默认情况下,不级联任何操作。

存在以下级联选项:

持久化:将持久化操作级联到关联实体

删除:将删除操作级联到关联实体

合并:将合并操作级联到关联实体

分离:将分离操作级联到关联实体

刷新:将刷新操作级联到关联实体


all:级联持久化、删除、合并、刷新和分离相关实体的操作。

首先您需要有@skrilled提到的
cascade={“persist”}

然后需要从数据库中检索模块实体。您提到在$module变量中有id

您需要类似这样的DQL语句

$builder = $this->getEntityManager()->createQueryBuilder();
$builder->select('m')
        ->from('Adm\Entity\Module', 'm')
        ->where('m.id IN (:modules)')
        ->setParameter('modules', $modules);
$moduleEntities= $builder->getQuery()->getResult(Query::HYDRATE_OBJECT);
在您的用户实体中,您将需要

public function addModules(Array $moduleEntities)
{
    foreach ($moduleEntities as $module) {
        if ($module instanceof Module) {
            $this->modules[] = $module;
        }
    }
    return $this;
}
最后,在addUser方法中,您需要添加来自上述DQL的模块数组

public function addUser($newUser, $moduleEntities)
{
    $user = new User();
    $user->setName($newUser['name']);
    ....
    $user->addModules($moduleEntities);
    $this->getEm()->persist($user);
    $this->getEm()->flush();
}

我希望这能有所帮助

Hi@skrilled,谢谢你的回答,我不知道。我需要将POST中的值插入一个名为user_module的表中(该表由user Entity中的$modules属性引用),你能给我一个例子来说明如何做到这一点吗?太棒了@Garry,你是个救生员。它工作得很好,我只需要替换:
$modulentities=$builder->getQuery()->getResult(Query::hydrome\u OBJECT)用于
$modulentities=$builder->getQuery()->getResult(\Doctrine\ORM\AbstractQuery::HYDRATE\u对象)谢谢您的时间!