Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 复合主键外键_Symfony_Orm_Doctrine Orm - Fatal编程技术网

Symfony 复合主键外键

Symfony 复合主键外键,symfony,orm,doctrine-orm,Symfony,Orm,Doctrine Orm,我使用Symfony 2从现有数据库实现了一个web应用程序 我已经设置了一个实体,其主键由两个外键组成 例如: 具有复合主键的Entity1:property1(主键)、property2(主键) Entity2主键由两个外键组成:property1(主键FK)、property2(主键FK)、Propertiet3(主键) 我不知道如何实施此关联: 在实体2中,我做: /** * @ORM\ManyToOne (targetEntity = "Entity1") * @ORM\Joi

我使用Symfony 2从现有数据库实现了一个web应用程序

我已经设置了一个实体,其主键由两个外键组成

例如:

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

我不知道如何实施此关联:

在实体2中,我做:

/** 
 * @ORM\ManyToOne (targetEntity = "Entity1") 
 * @ORM\JoinColumns ({
 *    @ORM\JoinColumn (name = "property1" referencedColumnName = "property1") 
 *    @ORM\JoinColumn (name = "property2" referencedColumnName = "property2") 
 *    @ORM\Id 
 * @}) 
 */ 
private $entity1; 
但我有一个错误:

无法将实体“examplebundle\entity\Entite1”与复合主键映射为另一实体“examplebundle\entity\Entite2#Entite1”主键的一部分

如何正确处理这种与教条的联系

我试图遵循这个例子,但我不明白:


您能否给出两个具有相似案例的实体的示例,特别是如何在这种情况下创建关节。

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

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

  • OneToMany:关联实体(ArticleAttributes)用作主键、引用实体(Artile)的主键和其他自身字段(attribute)
文章(id,标题,…), ArticleAttributes(#article_id,#属性,值,…)

  • ManyToMany:使用元数据连接表
在您的案例中,您希望引用一个实体,该实体没有unqiue标识符,但有一个复合密钥,所以不管理这种情况。只能具有关联实体类型的复合键

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

因此,解决方案是对主模型实体1使用主键


希望这有帮助。

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

/** @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;

这是一个有效的例子:

<?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;
}

似乎您错了,您通过复合键管理关联。这不是麻烦。问题是,用于关联的键似乎不能同时成为PK的一部分,这是错误写入的:
不可能将实体“…”与复合主键映射为另一个实体“…”主键的一部分。
。这种情况下有一个丑陋的解决方案:请正确阅读我的答案,我从来没有说过“条令[不]通过复合键管理关联”,相反,我说的是条令2在某些情况下正确管理复合主键。只有我提到的案例才能由doctrine 2Tanks很好地管理,但如果我设置(例如)$property1、$property2和$property3,这些字段将变为空。删除$foreignObject后,它可以正常工作。有没有办法同时使用这两种方法?
<?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;
}