我正在尝试让ManyToOne协会在学说中工作,但没有运气,这是我的关系代码:
// the entity : Product
/**
* @Id
* @ManyToOne(targetEntity="ProductsModule\Entity\Configuration", inversedBy="product")
* @JoinColumns={@JoinColumn(name="id_type", referencedColumnName="id"),
* @JoinColumn(name="id_site", referencedColumnName="id")}
*/
private $configurations;
/**
* @Id
* @ManyToOne(targetEntity="ProductsModule\Entity\Picture", inversedBy="product")
* @JoinColumn(name="id_picture", referencedColumnName="id")
*/
private $picture;
和关联的反转是:
// the entity : Configuration
/**
* @OneToMany(targetEntity="ProductsModule\Entity\Product", mappedBy="configurations")
*/
private $product;
// the code in the controller
$product = new Product;
$product->setConfiguration($configuration); // the configuration object is retrieved from DB
$product->setPicture($picture);
$this->em->persist($product);
try
{
$this->em->flush();
}
catch (\Exception $e)
{
var_dump($e->getMessage());die();
}
问题是Doctrine尝试设置JoinColumn的第一列(在上面的示例中:id_type)但它忽略了第二列,这会引发以下错误:
An exception occurred while executing 'INSERT INTO tableX (id_picture, id_type) VALUES (?, ?)' with params [1, 1]:SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`db`.`tableX`, CONSTRAINT `fk2` FOREIGN KEY (`id_site`) REFERENCES `sites` (`id`))
产品实体本身就是一个由ManyToMany关系诞生的实体(这就是为什么它有两个主键),我只是更改了实体的名称以保持代码私有,因为我不允许分享它。
谢谢。答案 0 :(得分:1)
您似乎拥有与网站属性相关的外键,尝试使用以下命令更新您的架构:
app/console doctrine:schema:update --force
如果你遇到同样的错误,试着删除表或数据库,如果这不会产生任何问题,并确保导出数据库的sql文件并删除所有外键,导入数据然后重新执行命令: app / console doctrine:schema:update --force