Symfony的2:学说一对多关系

问题描述:

我有2个实体:Symfony的2:学说一对多关系

class Client 
{ 
    /** 
    * @var integer $mainId 
    * 
    * @ORM\Column(name="main_id", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $mainId; 

    /** 
    * @var string $id 
    * 
    * @ORM\Column(name="id", type="string", length=10, nullable=false, unique=true) 
    */ 
    private $id; 

    ... 
} 

class Child 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $id; 

    /** 
    * @var Client 
    * 
    * @ORM\ManyToOne(targetEntity="Client") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="client_id", referencedColumnName="id") 
    * }) 
    */ 
    private $clientId; 

    .... 
} 

出于某种原因,从子表的外键不指向客户表的主键,但无论如何,我不我认为这应该是一个问题。

当我尝试做以下动作在我的控制器:

$儿童安全>设置...
$儿童安全> SETCLIENTID($客户端);
$ em-> persist($ child);

我得到以下错误:

Notice: Undefined index: id in C:\wamp\www\myApp\vendor\doctrine\lib\Doctrine\ORM\Persisters\BasicEntityPersister.php line 510 

我尝试添加@index anntotation在我的客户表,但我仍然得到错误...

我从来没有过这样的问题,任何帮助将受到欢迎。

编辑

如果我提出从$ mainId至$ ID的 “@ORM \ ID” 的注释在我的客户端类的作品。这是否意味着Doctrine 2不允许指向'非主键'字段的外键?

+0

客户端类中'main_id'和'id'的区别是什么?你为什么不''参考列名=“main_id”'? – meze 2011-12-30 10:04:29

+0

是的,我知道它很奇怪,但表是这样做的,我现在不能改变它(实际上id是一个字符串,mainId是一个自动递增的整数)......看我的编辑并告诉我你的想法。 – Yoot 2011-12-30 10:08:13

+0

当然你不能创建一个没有主键的关系...... – meze 2011-12-30 10:25:08

为什么不列你是否简单地设计了你的数据库中的所有东西,包括外键,等等......并且简单地在这里使用这个数据库创建你的实体?

http://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html

完全为我工作。

referencedColumnName应设置为具有@ORM\Id集,所以你的情况应该referencedColumnName="main_id"工作

(不要忘记清除缓存和运行doctrine:schema:update --force您更改这些设置后)