1

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

具有复合键的表

正如您在这种情况下看到的那样interestklists它们有自己的id但也有kuser作为关键。Doctrine 文档说他们支持复合键中的几乎所有用例,但是每个具有复合键的实体都不能使用除“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; 

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

4

1 回答 1

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 添加一个属性并设置inversedByin Interest.kuser

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

ManyToMany如果链接表没有其他属性,Doctrine 将自动生成链接表。您的 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 命令,这样你就可以从命令行试验这些东西。

于 2013-08-27T15:59:11.537 回答