Doctrine Composite主键外键

时间:2014-11-03 15:35:53

标签: symfony orm doctrine-orm

我从现有数据库中实现了一个带有Symfony 2的Web应用程序。

我已经设置了一个主键,其中包含两个外键。

示例:

具有复合主键的Entity1:property1(PK),property2(PK) Entity2主键由两个外键组成:property1(PK FK),property2(PK FK),propriete3(PK)

我不知道如何实现这种关联:

在entity2中我做:

/** 
 * @ORM\ManyToOne (targetEntity = "Entity1") 
 * @ORM\JoinColumns ({
 *    @ORM\JoinColumn (name = "property1" referencedColumnName = "property1") 
 *    @ORM\JoinColumn (name = "property2" referencedColumnName = "property2") 
 *    @ORM\Id 
 * @}) 
 */ 
private $entity1; 

但是我收到了一个错误:

无法将实体'ExempleBundle \ Entity \ Entite1'与复合主键映射为另一个实体'ExempleBundle \ Entity \ Entite2#entite1'的主键的一部分。

如何正确处理与Doctrine的这种关联

我尝试按照这个例子但我不明白:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html#use-case-1-dynamic-attributes

您能举例说明具有类似案例的两个实体,尤其是在这种情况下如何建立联合。

3 个答案:

答案 0 :(得分:2)

通过定义一个单独的外键,我找到了解决问题的工作方式, 使用原始外键列作为连接列。

/** @Id @Column(...) */
protected $property1;
/** @Id @Column(...) */
protected $property2;
/** @Id @Column(...) */
protected $property3;

/**
 * @ManyToOne(targetEntity="Entity1")
 * @JoinColumns({
 *     @JoinColumn(name="property1", referencedColumnName="property1"),
 *     @JoinColumn(name="property2", referencedColumnName="property2")
 * })
 **/
protected $foreignObject;

答案 1 :(得分:1)

这是一个有效的例子:

<?php

namespace Project\WorkflowBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="opinion")
 */
class Opinion
{
    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="\Project\WorkflowBundle\Entity\Comision_Proyecto", inversedBy="opiniones")
     */
    protected $comision;
    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="\Project\WorkflowBundle\Entity\Persona", inversedBy="opiniones")
     */
    protected $persona;
    /**
     * @ORM\OneToMany(targetEntity="\Project\WorkflowBundle\Entity\Comentario", mappedBy="opinion")
     */
    protected $comentarios;
}

另一堂课:

<?php


namespace Project\WorkflowBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="comentario")
 */
class Comentario
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     */
    protected $id;
    /**
     * @ORM\Column(type="boolean")
     */
    protected $privado;
    /**
     * @ORM\ManyToOne(targetEntity="\Project\WorkflowBundle\Entity\Opinion")
     *  @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="comision_id", referencedColumnName="comision_id"),
     *   @ORM\JoinColumn(name="persona_id", referencedColumnName="persona_id")
     * })
     */
    protected $opinion;
}

答案 2 :(得分:-1)

Doctrine2不管理外部组合键以引用具有其复合主键的实体

Doctrine2正确管理复合主键的情况主要是:

  • OneToMany:关联实体(ArticleAttributes)使用主键,引用实体(Artile)的主键和其他自我字段(属性)

文章( id ,标题,......), ArticleAttributes(#article_id,#attribute,value,...)

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html#use-case-1-dynamic-attributes

在您的情况下,您想要引用一个没有unqiue标识符但是没有复合键的实体,Doctrine不管理这种情况。您只能拥有关联实体类型的复合键。

通常,我避免使用复合键作为主要模型。我为关联类型的模型保留了复合键。

因此,解决方案是使用主模型Entity1的主键

希望这有帮助。