使用Doctrine2和Symfony2在具有复合键的表中生成ID键

时间:2013-08-27 13:29:07

标签: symfony doctrine-orm symfony-2.3

我的数据库中有一些带有复合键的表格,请参见下图:

Tables with composite keys

正如您在本案中所看到的那样interestklists他们拥有id,但也有kuser。 Doctrine docs说它们几乎支持复合键中的每个用例,但是每个具有复合键的实体都不能使用除“ASSIGNED”之外的id生成器。这意味着在调用EntityManager#persist($ entity)之前,ID字段必须设置其值。当我尝试定义与这些表相关的任何实体时,我收到了一个错误,因为Doctrine不允许这样做:

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

  /**
   * @ORM\Id      
   * @ORM\ManyToOne(targetEntity="UserBundle\Entity\User", inversedBy="users" )      
   * @ORM\JoinColumn(name="kuser", referencedColumnName="id")   
   */
   protected $kuser; 

我知道我可以使用生命周期回调运行一些代码,但不知道我在哪里或哪里需要一些帮助,任何人都可以告诉我或指出我在正确的道路上?

1 个答案:

答案 0 :(得分:2)

回到基础。我建议从这里开始:http://docs.doctrine-project.org/en/latest/reference/association-mapping.html

class KUser
{
    /**
     * @ORM\Id
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

class Interest
{
      /**
       * @ORM\Id
       * @ORM\Column(name="id", type="integer", nullable=false)
       * @ORM\GeneratedValue(strategy="AUTO")
       */
      protected $id;

      /**      
       * @ORM\ManyToOne(targetEntity="UserBundle\Entity\KUser")      
       * @ORM\JoinColumn(name="kuser_id", referencedColumnName="id")   
       */
      protected $kuser; 

这就是在Interest和KUser之间建立单向ManyToOne关系所需的一切。如果您需要双向,那么将$interests属性添加到KUser并在Interest.kuser中设置inversedBy

确保在继续之前了解简单的关系。

如果链接表没有其他属性,则Doctrine将自动生成ManyToMany链接表。您的KUserHasKLists确实有其他属性。因此,您需要将其设为实体,然后使用ManyToOne关系链接其他表。虽然从技术上讲你可能仍然在这里使用复合键,但定义一个自动增量主键要容易得多。

class KUserHasKLists
{
      /**
       * @ORM\Id
       * @ORM\Column(name="id", type="integer", nullable=false)
       * @ORM\GeneratedValue(strategy="AUTO")
       */
      protected $id;

      /**      
       * @ORM\ManyToOne(targetEntity="UserBundle\Entity\KUser")      
       * @ORM\JoinColumn(name="kuser_id", referencedColumnName="id")   
       */
      protected $kuser; 

      /**      
       * @ORM\ManyToOne(targetEntity="UserBundle\Entity\KList")      
       * @ORM\JoinColumn(name="klist_id", referencedColumnName="id")   
       */
      protected $klist; 

但是,再次,从一个简单的关系开始,并确保你了解发生了什么。如果你对phpunit感到满意,可以自己做一些功能测试。如果没有,请自己制作一个Symfony Command,以便从命令行中试验这些东西。