这让我发疯了。
Client
可以包含多个Vehicle
个。
这是一对多关系。在尝试保存实体时,我收到一条错误,指出外键为空。当我删除Doctrine关系并单独存储Vehicle
时,一切正常。
这就是我创建关系的方式:
class Vehicle {
...
/**
* @ORM\ManyToOne(targetEntity="Client", inversedBy="vehicles")
* @ORM\JoinColumn(name="client_id", referencedColumnName="id")
*/
public $client;
}
class Client {
...
public function __construct()
{
parent::__construct();
$this->vehicles = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* @ORM\OneToMany(targetEntity="Vehicle", mappedBy="client", cascade={"persist"})
*/
private $vehicles;
}
我尝试保存这样的实体:
$client = new Client();
$vehicle = new Vehicle();
$client->getVehicles()->add($vehicle);
$em->persist($client);
$em->flush();
接下来,我收到一条PDO异常,指出client_id
表上的null
不能为Vehicle
。
似乎Doctrine没有正确复制外键。
我做错了什么?
答案 0 :(得分:0)
根据their docs:
无法使用指向非主键的连接列。
Doctrine会认为这些是主键并使用数据创建延迟加载代理,这可能会导致意外结果。出于性能原因,Doctrine可以在运行时不验证此设置的正确性,而只能通过Validate Schema命令验证。
显然你需要一种不同的方法。
在他们的例子中给出了一个解决方案:
CREATE TABLE product ( id INTEGER, name VARCHAR, PRIMARY KEY(id) ); CREATE TABLE product_attributes ( product_id INTEGER, attribute_name VARCHAR, attribute_value VARCHAR, PRIMARY KEY (product_id, attribute_name) );
此架构应映射到产品实体,如下所示:
class Product { private $id; private $name; private $attributes = array(); }
attribute_name
列包含密钥,attribute_value
包含$attributes
中每个数组元素的值。