编辑:我做了@MichaelHirschler和@MayaShah建议并解决了问题,它允许我使用doctrine:migration:diff命令创建一个Doctrine Migration文件,但是当我尝试使用doctrine迁移这些更改到数据库:migration:迁移出现以下错误。
执行期间迁移20170325192546失败。错误执行'ALTER TABLE business ADD CONSTRAINT FK_8D36E3844FFE0C3 FOREIGN KEY(client_email)REFERENCES客户端(clientEmail)'时出现异常:
SQLSTATE [HY000]:常规错误:1005无法创建表'eship_case。#sql-81c_e'(错误号:150)
[Doctrine \ DBAL \ Exception \ DriverException]执行'ALTER TABLE business ADD CONSTRAINT FK_8D36E3844FFE0C3 FOREIGN KEY(client_email)REFERENCES客户端(clientEmail)'时发生异常:
我知道这是一个MySQL错误,但我认为Doctrine会处理迁移,所以当它没有时,我不知道如何修复它。我可以在MySQL上手动执行模式来解决这个问题,但我不知道它会如何影响Symfony中的ORM模式。很抱歉打扰,我是PHP的新手,因此是Symfony和Doctrine的新手。
原帖: 我正在使用Symfony Framework和MySQL作为数据库来进行Web应用程序。我正在使用doctrine来执行ORM来映射数据库。但是,当我尝试更新数据库的架构以包含外键时,会出现以下错误:1 我并没有真正理解这个错误,我将不胜感激,任何人都可以给予我任何帮助。
这是两个类的代码。 Client的主键是clientEmail,我希望与该业务实体的密钥建立关系。我知道可能有一些文档丢失但我正在尝试修复此错误,然后再转向。课程更长,但我只发布了可能导致问题的区域。
商务舱:
<?php
/**
* @ORM\Entity
* @ORM\Table(name="business")
*/
class Business
{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer")
*/
private $businessId;
/**
* @ORM\Column(type="string")
*/
private $name;
/**
* @ORM\Column(type="string")
*/
private $stage_Of_Development;
//Relations
/**
* @ORM\ManyToOne(targetEntity="Client")
*/
private $client;
//Getters and Setters
/**
* @return mixed
*/
public function getClient()
{
return $this->client;
}
/**
* @param mixed $client
*/
public function setClient(Client $client)
{
$this->client = $client;
}
}
客户类:
<?php
/**
* @ORM\Entity
* @ORM\Table(name="client")
*/
class Client
{
/**
* @ORM\ID
* @ORM\Column(type="string")
*/
private $clientEmail;
/**
* @return mixed
*/
public function getClientEmail()
{
return $this->clientEmail;
}
/**
* @param mixed $clientEmail
*/
public function setClientEmail($clientEmail)
{
$this->clientEmail = $clientEmail;
}
}
答案 0 :(得分:1)
请为客户字段添加加入列。
/**
* @ORM\ManyToOne(targetEntity="Client")
* @ORM\JoinColumn(name="client_email", referencedColumnName="clientEmail")
*/
private $client;
答案 1 :(得分:0)
默认情况下,Doctrine将@ManyToOne
映射到外部实体上的id字段。如果要覆盖它,则需要自己定义:
class Business
{
// ...
/**
* @ORM\ManyToOne(targetEntity="Client")
* @ORM\JoinColumn(name="client_email", referencedColumnName="clientEmail")
*/
private $client;
// ..
}
请查看Association Mapping in Doctrine。
另请注意:您当前的映射并不能确保ClientEmail
的唯一性,如果有人添加相同的$clientEmail
两次,这可能会破坏您的行为。