我从现有数据库中实现了一个带有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
您能举例说明具有类似案例的两个实体,尤其是在这种情况下如何建立联合。
答案 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正确管理复合主键的情况主要是:
文章( id ,标题,......), ArticleAttributes(#article_id,#attribute,value,...)
在您的情况下,您想要引用一个没有unqiue标识符但是没有复合键的实体,Doctrine不管理这种情况。您只能拥有关联实体类型的复合键。
通常,我避免使用复合键作为主要模型。我为关联类型的模型保留了复合键。
因此,解决方案是使用主模型Entity1的主键
希望这有帮助。