基本问题:
是否可以使用不引用主键而仅引用唯一键的 Doctrine 来映射关联?
扩大的视野:
我有一个实体(Participation
) which may参考2个其他实体(DropoutCause
and DischargeType
)。根据此组合,隐含了一些其他属性,基于另一个(第四个)表(DropoutScenario
)在数据库中。因为两个引用实体中的任何一个都可能为空,所以我无法将它们声明为主键,而只是第四个表中的唯一键。
问题是当我尝试用 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;
辍学场景:
<?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;