在Doctrine(Symfony2)中的ManyToMany连接表中有附加列

时间:2014-09-09 08:09:12

标签: symfony doctrine-orm many-to-many

场合

我有两个实体用户和组关系ManyToMany。关系创建为具有两列user_groupuser_id的分隔表(称为group_id)。

问题

我想在表addedOn TIMESTAMP DEFAULT CURRENT_TIMESTAMP中再添加一个字段user_group。我不在乎该学说不会看到这个专栏,我可以在需要时通过SQL选择它。

问题

可以通过学说配置来完成吗?如果有,怎么样? 我知道我可以在DB中添加列,但每次生成迁移差异时都会有SQL语句删除此列。

相关信息

App:Symfony 2.5,Doctrine 2.4。

关系在配置中定义为User.php:

/**
 * @ORM\ManyToMany(targetEntity="RAZ\UserBundle\Entity\Group")
 * @ORM\JoinTable(name="user_group",
 *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}
 * )
 */
protected $groups;

1 个答案:

答案 0 :(得分:7)

不,你不能,在你的联结表中有ManyToMany关联和附加列,你需要重写你的映射,以便在你的用户和组实体之间建立一个联结实体,如下所示

对于用户,您的映射将类似于

        OneToMany
      ------------>
User          UserHasGroups
      <------------
        ManyToOne

组实体相同

        OneToMany
       ----------->
Group          UserHasGroups
       <-----------
        ManyToOne

现在您可以将实体设置为

用户实体

/**
 * User
 * @ORM\Table(name="user_table_name")
 * @ORM\Entity
 */
class User
{
    /**
     * @ORM\OneToMany(targetEntity="NameSpace\YourBundle\Entity\UserHasGroups", mappedBy="users",cascade={"persist","remove"} )
     */
    protected $hasGroups;

}

集团实体

/**
 * Group
 * @ORM\Table(name="group_table_name")
 * @ORM\Entity
 */
class Group 
{
    /**
     * @ORM\OneToMany(targetEntity="NameSpace\YourBundle\Entity\UserHasGroups", mappedBy="groups",cascade={"persist","remove"} )
     */
    protected $hasUsers;

}

UserHasGroups实体

/**
 * UserHasGroups
 * @ORM\Table(name="user_groups_table_name")
 * @ORM\Entity
 */
class UserHasGroups
{

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

    /**
     * @ORM\ManyToOne(targetEntity="NameSpace\YourBundle\Entity\Group", cascade={"persist"}, fetch="LAZY")
     * @ORM\JoinColumn(name="group_id", referencedColumnName="id")
     */
    protected $groups;

    /**
     * @ORM\ManyToOne(targetEntity="NameSpace\YourBundle\Entity\User", cascade={"persist","remove"} ,inversedBy="medias", fetch="LAZY" )
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id",nullable=true)
     */
    protected $users;


    /**
     * @var \DateTime
     * @ORM\Column(name="added_on", type="datetime")
     */
    protected $addedOn;

    public function __construct()
    {
        $this->addedOn= new \DateTime('now');
    }

}

现在您已经映射了您的实体,您可以使用UserHasGroups实体使用存储库方法,提供用户和组值,如findBy,findAll等,或者如果您有用户对象,那么您可以直接获取{{1包含该用户的关联集合的对象