我有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不允许指向“非主键”字段的外键?
答案 0 :(得分:1)
referencedColumnName
应设置为@ORM\Id
设置的列,因此在您的情况下referencedColumnName="main_id"
应该正常工作
(不要忘记清除缓存并在更改这些设置后运行doctrine:schema:update --force
)
答案 1 :(得分:0)
为什么不简单地设计数据库中的所有内容,包括外键等等......只需使用此处基于数据库创建实体?
http://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html
对我来说很完美。