Symfony2学说ManyToMany关系

时间:2014-08-09 20:55:10

标签: symfony many-to-many dql

我是Synfony2和学说用法的初学者。我创建了两个实体如下:

对于EndUser实体(FOSUserBundle的扩展名):

/**
 * EndUser
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Core\CustomerBundle\Entity\EndUserRepository")
 */
class EndUser extends BaseUser {
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToMany(targetEntity="Core\GeneralBundle\Entity\Discipline", mappedBy="endusers")
     */
    private $discipline;

和纪律实体

class Discipline {
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToMany(targetEntity="Core\CustomerBundle\Entity\EndUser", inversedBy="discipline")
     */
    private $endusers;

当我做"php app/console doctrine:schema:update -- force时,

EndUserDisciplinediscipline_enduser表已创建。

当我通过phpmyadmin运行标准SQL请求时:

select t0.*
from
discipline t0,
discipline_enduser t2
where 
t2.enduser_id = 1
and 
t2.discipline_id = t0.id

我获得了预期结果作为特定用户的纪律列表。

我关心的是如何使用Symfony2&amp ;;的实体来实现相同的功能。教义

3 个答案:

答案 0 :(得分:0)

您真正需要做的就是修改您的EndUser实体以包含以下内容:

use Doctrine\Common\Collections\ArrayCollection;

class EndUser extends BaseUser 
{
    private $discipline;

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

    public function setDiscipline($discipline)
    {
        $this->discipline = $discipline;

        return $this;
    }

    public function getDiscipline()
    {
        return $this->discipline;
    }
}

然后同样修改Discipline,用endUser代替纪律。

无需创建中间实体。学说已经明白了。干净,嗯?!

答案 1 :(得分:0)

首先,我建议为您的关系使用更多自然语言名称,例如disciplinesendUsers,因为它是manyToMany键。此外,您需要为每个方法创建getset方法。为实体准备好所有属性后,应该运行命令Generate your getters and setters

//this will generate all entities
php app/console doctrine:generate:entities BundleNamespace

之后,您可以执行以下操作:

$endUser->getDisciplines(); //return all disciplines of this user
$endUser->addDiscipline($someDiscipline); //add another discipline
$endUser->removeDiscipline($iAmABadDiscipline); //remove this discipline from this user
array $disciplines = [ ... ];
$endUser->setDisciplines($disciplines); // set multiple disciplines

同样的逻辑适用于Discipline实体,当然您应该使用EntityManager更新它们,您可以在答案here中阅读更多内容。

答案 2 :(得分:0)

为了使事情更加连贯,将您的班级成员重命名为$ disciplines(它是多对多的,因此可能有多个学科)。然后,您需要实体中的setter和getter来访问这些规则。

一种方法是在命令行上执行此操作:

php app/console doctrine:generate:entities YourBundle:EndUser

这将为您的班级添加所需的方法。未修改的类文件版本在EndUser.php中备份〜以防万一被覆盖。

完成此操作后,您可以调用getter来获取学科:

$disciplines = $anEndUser->getDisciplines();

例如在控制器方法中:

public function someAction()
{
    $anEndUser = $this
        ->getDoctrine()
        ->getManager()
        ->getRepository('YourBundle:EndUser')
        ->find(1)
    ;
    $disciplines = $anEndUser->getDisciplines();
}