非Id列的Doctrine2关系

时间:2016-01-09 15:20:04

标签: symfony orm doctrine-orm

我正在使用Symfony 3,Doctrine 2.5构建一个简单的Web服务,并在简化结构中坚持下面描述的ORM关系。

我有一个Action实体,其中包含许多具有ManyToOne关系的动作......

class Action
{
/**
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var integer
 *
 * @ORM\ManyToOne(targetEntity="\AppBundle\Entity\Status")
 * @ORM\JoinColumn(referencedColumnName="code", nullable=false)
 */
private $status;

和具有一些状态的状态实体。

class Status
{
/**
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(type="integer", unique=true)
 */
private $code;

我无法正确设置referencedColumnName =" code" Action实体的列(不是' Id'像往常一样)。

以这种方式配置repo在持续时刻抛出wxception" 注意:未定义索引:代码&#34 ;;

我猜它是mapBy或inversedBy注释参数......但是不能弄清楚"如何"。

2 个答案:

答案 0 :(得分:2)

不幸的是,Doctrine(reference)不支持它。

您可以像这样编辑您的状态实体(确保在保留之前设置代码):

class Status
{

    /**
     * @ORM\Column(name="code", type="integer", unique=true)
     * @ORM\Id
     */
    private $code;

}

如果您需要自动增量字段,可以查看this答案以获取可能的解决方案。

答案 1 :(得分:0)

以为我想添加您仍然可以通过将实体本身用作联接表来使用非主键。这将起作用,但是您仍然需要正确设置关系密钥。

示例:

2>nul

好处是它可以很好地解决。

请记住以下几点:

  • 这是一个集合,而不是单个实例;
  • 您必须手动管理列;
  • 您必须正确设置约束(索引,键等);
  • 检查您的查询是否仍然有效!