Symfony 2:Doctrine OneToMany关系

时间:2011-12-30 09:54:06

标签: indexing symfony doctrine-orm many-to-one

我有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;

    ....
}

由于某种原因,子表中的外键不指向Client表的主键,但无论如何我认为它不应该是一个问题。

当我尝试在控制器中执行以下操作时:

$儿童安全>设置...
$儿童安全> SETCLIENTID($客户端);
$ EM->坚持($子);

我收到以下错误:

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

我尝试在我的客户端表中添加@Index anntotation但我仍然收到错误...

我之前从未遇到过这个问题,欢迎任何帮助。

修改

如果我在我的Client类中将“@ORM \ Id”注释从$ mainId移动到$ id,那就可以了。这是否意味着Doctrine 2不允许指向“非主键”字段的外键?

2 个答案:

答案 0 :(得分:1)

referencedColumnName应设置为@ORM\Id设置的列,因此在您的情况下referencedColumnName="main_id"应该正常工作

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

答案 1 :(得分:0)

为什么不简单地设计数据库中的所有内容,包括外键等等......只需使用此处基于数据库创建实体?

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

对我来说很完美。