Symfony Doctrine 多对多带注释

Symfony Doctrine Many to Many with annotations

我有 3 个 类 具有 ManyToMany 关系(2 类 和其他产生此关联)。 类 是:用户、组和用户组(这个有额外的字段)。

问题(2 个,但相似)

AppBundle\Entity\User
关联 AppBundle\Entity\User#usergroups 指的是拥有方字段 AppBundle\Entity\UserGroup#user 未定义为关联,而是定义为字段。 关联 AppBundle\Entity\User#usergroups 指的是不存在的拥有方字段 AppBundle\Entity\UserGroup#user。

AppBundle\Entity\Group
关联 AppBundle\Entity\Group#usergroups 指的是拥有方字段 AppBundle\Entity\UserGroup#group ,它未定义为关联,而是定义为字段。 关联 AppBundle\Entity\Group#usergroups 指的是不存在的拥有方字段 AppBundle\Entity\UserGroup#group。

AppBundle/Entity/User.php

<?php
// src/AppBundle/Entity/User.php

namespace AppBundle\Entity;

use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use AppBundle\Entity\UserGroup;

/**
 * @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{
    /**Id
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=15)
     */
    protected $phone;

    /**
     * @ORM\OneToMany(targetEntity="UserGroup", mappedBy="user")
     */
    private $usergroups;

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

    /**
     * Set phone
     *
     * @param string $phone
     * @return User
     */
    public function setPhone($phone)
    {
        $this->phone = $phone;

        return $this;
    }

    /**
     * Get phone
     *
     * @return string 
     */
    public function getPhone()
    {
        return $this->phone;
    }

    /**
     * Add usergroups
     *
     * @param UserGroup $usergroup
     * @return User
     */
    public function addUsergroup(UserGroup $usergroup)
    {
        $this->usergroups[] = $usergroup;

        return $this;
    }

    /**
     * Remove usergroups
     *
     * @param UserGroup $usergroup
     */
    public function removeUsergroup(UserGroup $usergroup)
    {
        $this->usergroups->removeElement($usergroup);
    }

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

AppBundle/Entity/Group.php

<?php

// src/AppBundle/Entity/Group.php

namespace AppBundle\Entity;

use FOS\UserBundle\Model\Group as BaseGroup;
use Doctrine\ORM\Mapping as ORM;
use AppBundle\Entity\UserGroup;

/**
 * @ORM\Entity(repositoryClass="AppBundle\Repository\GroupRepository")
 * @ORM\Table(name="fos_group")
 *
 */
class Group extends BaseGroup
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", columnDefinition="ENUM('department', 'workgroup')")
     */
    protected $grouptype;

    /**
     * @ORM\OneToMany(targetEntity="UserGroup", mappedBy="group")
     */
    private $usergroups;


    public function __construct()
    {
        parent::__construct('',array());
        $this->usergroups = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Is the given User the author of this Post?
     *
     * @param User $user
     *
     * @return bool
     */
    public function isAdmin(User $user)
    {
        //$users_tmp = $this->getUsergroups();

        //exit(\Doctrine\Common\Util\Debug::dump($users_tmp));
        /*

         foreach ($this->usergroups as $user) {
            if ($user->)
            $valor = $valor * 2;
        }
        return $user->id() === $this->getId();
        */
        return true;
    }

    /**
     * Set grouptype
     *
     * @param string $grouptype
     * @return Group
     */
    public function setGrouptype($grouptype)
    {
        $this->grouptype = $grouptype;

        return $this;
    }

    /**
     * Get grouptype
     *
     * @return string 
     */
    public function getGrouptype()
    {
        return $this->grouptype;
    }

    /**
     * Add usergroups
     *
     * @param \AppBundle\Entity\UserGroup $usergroups
     * @return Group
     */
    public function addUsergroup(\AppBundle\Entity\UserGroup $usergroups)
    {
        $this->usergroups[] = $usergroups;

        return $this;
    }

    /**
     * Remove usergroups
     *
     * @param \AppBundle\Entity\UserGroup $usergroups
     */
    public function removeUsergroup(\AppBundle\Entity\UserGroup $usergroups)
    {
        $this->usergroups->removeElement($usergroups);
    }

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

AppBundle/Entity/UserGroup.php

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity(repositoryClass="AppBundle\Repository\UserGroupRepository")
 * @ORM\Table(name="fos_user_group")
 */
class UserGroup
{

    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="integer")
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="usergroups", cascade={"persist"})
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    private $user;

    /**
     * @ORM\Column(type="integer")
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Group", inversedBy="usergroups", cascade={"persist"})
     * @ORM\JoinColumn(name="group_id", referencedColumnName="id")
     */
    private $group;

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


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

    /**
     * Set user
     *
     * @param integer $user
     * @return UserGroup
     */
    public function setUser($user)
    {
        $this->user = $user;

        return $this;
    }

    /**
     * Get user
     *
     * @return integer 
     */
    public function getUser()
    {
        return $this->user;
    }

    /**
     * Set group
     *
     * @param integer $group
     * @return UserGroup
     */
    public function setGroup($group)
    {
        $this->group = $group;

        return $this;
    }

    /**
     * Get group
     *
     * @return integer 
     */
    public function getGroup()
    {
        return $this->group;
    }

    /**
     * Set role
     *
     * @param string $role
     * @return UserGroup
     */
    public function setRole($role)
    {
        $this->role = $role;

        return $this;
    }

    /**
     * Get role
     *
     * @return string 
     */
    public function getRole()
    {
        return $this->role;
    }
}

拜托,欢迎任何帮助。谢谢...

第一个错误:

AppBundle\Entity\UserGroup#user

您添加了映射 @ORM\Column(type="integer") - 删除它,映射器知道如何定义关系。

    /**
     * @ORM\Column(type="integer")
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="usergroups", cascade={"persist"})
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    private $user;

    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="usergroups", cascade={"persist"})
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    private $user;

第二个错误 - 同样的情况:

    /**
     * @ORM\Column(type="integer")
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Group", inversedBy="usergroups", cascade={"persist"})
     * @ORM\JoinColumn(name="group_id", referencedColumnName="id")
     */
    private $group;

列与关联不同。 我想,仅此而已:)

你注释错了。 下面是注释 ManyToOne 关系的示例

/**
* @ORM\ManyToOne(targetEntity="Group")
* @ORM\JoinColumn(name="group_id", referencedColumnName="id", onDelete="persist")
*/

关注link对您有更多帮助。 Mapping Information 谢谢