Doctrine 2映射引用唯一键

时间:2014-06-05 11:59:36

标签: php mysql doctrine-orm

基本问题:

是否可以使用Doctrine引用而不是主键但只有唯一键来映射关联?

扩展版本:

我有一个实体(Participation可能引用其他两个实体(DropoutCauseDischargeType)。根据此组合,基于数据库中的另一个(第4个)表(DropoutScenario)隐含了一些其他属性。因为两个引用的实体中的任何一个都可以为null,所以我不能将它们声明为主要但只是第4个表中的唯一键。

问题是我在尝试使用Doctrine进行映射时只会出错:

  

缺少主键ID的值   应用程序\实体\培训\ DropoutScenario

我做错了什么,或者使用Doctrine这是不可能的? 如果没有,有什么更好的解决方案我能做到这一点吗?

我现在已经搜索了很长时间并挖掘了Doctrine文档,但我根本找不到任何内容......

我的映射的剥离代码示例如下。

参与:

<?php

namespace Application\Entity\Trainings;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\MappedSuperclass
 */
abstract class Participation {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="Application\Entity\DropoutCause")
     * @ORM\JoinColumn(name="dropout_cause_id", referencedColumnName="id"))
     */
    protected $dropoutCause;

    /**
     * @ORM\ManyToOne(targetEntity="Application\Entity\DischargeType")
     * @ORM\JoinColumn(name="discharge_id", referencedColumnName="id"))
     */
    protected $dischargeType;

    /**
     * @ORM\ManyToOne(targetEntity="DropoutScenario")
     * @ORM\JoinColumns({
     * @ORM\JoinColumn(name="discharge_id", referencedColumnName="discharge_id"),
     * @ORM\JoinColumn(name="dropout_cause_id", referencedColumnName="dropout_cause_id")
     * })
     */
    private $scenario;

DropoutScenario:

<?php

namespace Application\Entity\Trainings;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="training_dropout_scenarios")
 */
class DropoutScenario {

    /**
     * @var int
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="Application\Entity\DropoutCause")
     * @ORM\JoinColumn(name="dropout_cause_id", referencedColumnName="id"))
     */
    protected $dropoutCause;

    /**
     * @ORM\ManyToOne(targetEntity="Application\Entity\DischargeType")
     * @ORM\JoinColumn(name="discharge_id", referencedColumnName="id"))
     */
    protected $dischargeType;

    /** @ORM\Column(type="integer", name="dropout_cause_id") */
    protected $dropoutCauseId;

    /** @ORM\Column(type="integer", name="discharge_id") */
    protected $dischargeTypeId;

2 个答案:

答案 0 :(得分:6)

由于我没有得到任何答案,我今天做了另一项研究,我通过Doctrine邮件列表论坛找到了我自己的问题的答案。 好像我刚刚搜索了错误的关键字......

不幸的是,学说2不支持它。太遗憾了! :(

来自Doctrine文档: http://doctrine-orm.readthedocs.org/en/latest/reference/limitations-and-known-issues.html#join-columns-with-non-primary-keys

  

无法使用指向非主键的连接列。   Doctrine会认为这些是主键并创建延迟加载   代理与数据,这可能会导致意外的结果。教义   出于性能原因,可能无法验证其正确性   在运行时设置,但只能通过Validate Schema命令。

类似的问题: Is it possible to reference a column other than 'id' for a JoinColumn?

答案 1 :(得分:0)

就像以下引用一样,Doctrine不支持这种类型的映射

http://www.doctrine-project.org/jira/browse/DDC-1269

http://www.doctrine-project.org/jira/browse/DDC-1114

我认为这会对你有所帮助。