一对多关系删除Doctrine中的外键

时间:2014-11-12 15:54:45

标签: php database pdo doctrine-orm doctrine

这让我发疯了。

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没有正确复制外键。

我做错了什么?

1 个答案:

答案 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中每个数组元素的值。