教义2关系(ManyToMany)在ZF3中不起作用

马修

我花了两天的时间,但仍然找不到解决方案,为什么它不起作用。我使用教程在Zend Framework 3中实现了Doctrine。在站点上,是实体中ManyToMany关系的实现。我在项目(User-Role)中以1:1的比例使用了它,但是它不起作用。每当我想获取用户的所有角色时($ user-> getRoles()),我都会得到NULL

用户实体

<?php

namespace User\Entity;

use Doctrine\ORM\Mapping as ORM;
use Development\Entity\AbstractEntity;
use Development\Entity\Traits\EntityId;
use Development\Exception\EntityException;
use Doctrine\Common\Collections\ArrayCollection;
use Utils\StringUtils;

/**
 * @ORM\Entity(repositoryClass="User\Repository\UserRepository")
 * @ORM\Table(name="user")
 */
class User extends AbstractEntity
{
use EntityId;

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

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

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

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

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

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

/**
 * @ORM\ManyToMany(targetEntity="User\Entity\Role")
 * @ORM\JoinTable(name="user_role",
 *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")}
 *      )
 */
private $roles;

public function __construct()
{
    $this->roles = new ArrayCollection();
}

public function __toString()
{
    return $this->getFullName();
}

public function addRole($role)
{
    $this->roles[] = $role;
}

public function getRoles()
{
    return $this->roles;
}

public function removeRole($role)
{
    $this->roles->removeElement($role);
}

/**
 * @param integer $mbCase
 *
 * @return string
 *
 */
public function getFullName($mbCase = MB_CASE_TITLE)
{
    if (!StringUtils::isEmpty($this->surname)) {
        $fullName = mb_convert_case($this->name . ' ' . $this->surname, $mbCase, "UTF-8");
    } else {
        $fullName = mb_convert_case($this->name, $mbCase, "UTF-8");
    }

    return trim($fullName);
}

/**
 * @return string
 *
 */
public function getLogin()
{
    return $this->login;
}

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

/**
 * @param mixed $login
 */
public function setLogin($login)
{
    $this->login = StringUtils::toLower($login);
}
}

角色实体

<?php

namespace User\Entity;

use Development\Entity\AbstractEntity;
use Development\Entity\Traits\EntityId;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * This class represents a role.
 * @ORM\Entity()
 * @ORM\Table(name="role")
 */
class Role extends AbstractEntity
{
use EntityId;

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

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

/**
 * @ORM\Column(name="date_created")
 */
protected $dateCreated;

/**
 * @var Role[]
 *
 * @ORM\ManyToMany(targetEntity="User\Entity\Role")
 * @ORM\JoinTable(name="role_hierarchy",
 *      joinColumns={@ORM\JoinColumn(name="child_role_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="parent_role_id", referencedColumnName="id")}
 *      )
 */
private $parentRoles;

/**
 * @var Role[]
 *
 * @ORM\ManyToMany(targetEntity="User\Entity\Role")
 * @ORM\JoinTable(name="role_hierarchy",
 *      joinColumns={@ORM\JoinColumn(name="parent_role_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="child_role_id", referencedColumnName="id")}
 *      )
 */
protected $childRoles;

/**
 * @var Permission[]
 *
 * @ORM\ManyToMany(targetEntity="User\Entity\Permission")
 * @ORM\JoinTable(name="role_permission",
 *      joinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="permission_id", referencedColumnName="id")}
 *      )
 */
private $permissions;

/**
 * Constructor.
 */
public function __construct()
{
    $this->parentRoles = new ArrayCollection();
    $this->childRoles = new ArrayCollection();
    $this->permissions = new ArrayCollection();
}

public function getName()
{
    return $this->name;
}

public function setName($name)
{
    $this->name = $name;
}

public function getDescription()
{
    return $this->description;
}

public function setDescription($description)
{
    $this->description = $description;
}

public function getDateCreated()
{
    return $this->dateCreated;
}

public function setDateCreated($dateCreated)
{
    $this->dateCreated = $dateCreated;
}

public function getParentRoles()
{
    return $this->parentRoles;
}

public function getChildRoles()
{
    return $this->childRoles;
}

public function getPermissions()
{
    return $this->permissions;
}
}

我正在使用最新的Doctrine ORM模块和Zend3。您知道我应该在哪里寻找解决方案吗?如果需要,我将在接下来的8小时内添加代码。在这种与学说的关系中,什么重要?其他关系很好。

我尝试了您的示例,它对我有用。您必须考虑的几件事。在“ Doctrine”中,默认情况下,关联被标记为“惰性”,这意味着关联的整个集合对象在首次访问时就被填充。因此,为了填充您的角色,您必须执行以下操作:

    foreach ($user->getRoles() as $role) {
        echo $role->getName();
    }

或者,您可以fetch="EAGER"在关联注释中使用:

/**
 * @ORM\ManyToMany(targetEntity="User\Entity\Role", fetch="EAGER")
 * @ORM\JoinTable(name="user_role",
 *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")}
 *      )
 */
private $roles;

看看这个问题,看看之间的区别fetch="EAGER"fetch="LAZY"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章