代码之家  ›  专栏  ›  技术社区  ›  Jack Skeletron

原则2通过两个实体的复合密钥一对一

  •  1
  • Jack Skeletron  · 技术社区  · 7 年前

    我有一个类似的问题 to this one .

    我需要通过复合键建立一对一的关系,是否可能?我读过 this 但这是一对多的关系

    class Header{
        /**
         * 
         * @ORM\Id
         * @ORM\Column(name="UH1", type="integer", nullable=false)
         */
        protected $key1;
    
        /**
         * 
         * @ORM\Id
         * @ORM\Column(name="UH2", type="integer", nullable=false)
         */
        protected $key2;
    
        /**
         * @ORM\OneToOne(targetEntity="Detail", mappedBy="header")
         */
        protected $detail;
    } 
    
    class Detail{
    /**
         * 
         * @ORM\Id
         * @ORM\Column(name="UD1", type="integer", nullable=false)
         */
        protected $key1;
    
        /**
         * 
         * @ORM\Id
         * @ORM\Column(name="UD2", type="integer", nullable=false)
         */
        protected $key2;
    
        /**
         * @ORM\OneToOne(targetEntity="Header", inversedBy="detail")
         */
        protected $header;
    }
    

    我的意思是每个实体有两列作为Id。。。我需要添加吗 the joincolumn ?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Alan T.    7 年前

    您需要使用 JoinColumns 允许定义 JoinColumn 用于处理此类情况的注释 ManyToOne OneToOne 关联。

    与以下实体:

    AppBundle\Entity\A.php

    namespace AppBundle\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\Entity()
     */
    class A
    {
        /**
         * @ORM\Id
         * @ORM\Column(name="key1", type="integer", nullable=false)
         */
        private $key1;
    
        /**
         * @ORM\Id
         * @ORM\Column(name="key2", type="integer", nullable=false)
         */
        private $key2;
    
        /**
         * @ORM\OneToOne(targetEntity="AppBundle\Entity\B", mappedBy="a")
         * @ORM\JoinColumns(
         *      @ORM\JoinColumn(name="key1", referencedColumnName="key1"),
         *      @ORM\JoinColumn(name="key2", referencedColumnName="key2"),
         * )
         */
        private $b;
    }
    

    AppBundle\Entity\B.php

    namespace AppBundle\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\Entity()
     */
    class B
    {
        /**
         * @ORM\Id
         * @ORM\Column(name="key1", type="integer", nullable=false)
         */
        private $key1;
    
        /**
         * @ORM\Id
         * @ORM\Column(name="key2", type="integer", nullable=false)
         */
        private $key2;
    
        /**
         * @ORM\OneToOne(targetEntity="AppBundle\Entity\A", inversedBy="b")
         * @ORM\JoinColumns(
         *      @ORM\JoinColumn(name="key1", referencedColumnName="key1"),
         *      @ORM\JoinColumn(name="key2", referencedColumnName="key2"),
         * )
         */
        private $a;
    }
    

    我可以达到期望的行为。当要求更新模式时,条令输出:

    CREATE TABLE a (key1 INT NOT NULL, key2 INT NOT NULL, UNIQUE INDEX b_uniq (key1, key2), PRIMARY KEY(key1, key2)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
    CREATE TABLE b (key1 INT NOT NULL, key2 INT NOT NULL, UNIQUE INDEX a_uniq (key1, key2), PRIMARY KEY(key1, key2)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
    ALTER TABLE a ADD CONSTRAINT FK_E8B7BE432C5C6450B55535EA FOREIGN KEY (key1, key2) REFERENCES b (key1, key2);
    ALTER TABLE b ADD CONSTRAINT FK_71BEEFF92C5C6450B55535EA FOREIGN KEY (key1, key2) REFERENCES a (key1, key2);