教义ORM例外



编辑:我按照@MichaelHirschler和@MayaShah的建议做了,它解决了问题,它允许我使用doctrine:migration:diff命令创建一个Doctrine Migration文件,但是当我尝试使用doctrine:migration:migrate 将这些更改迁移到数据库中时,出现了以下错误。

迁移20170325192546执行期间失败。错误 执行"更改表业务添加约束FK_8D36E3844FFE0C3外键 (client_email) 引用客户端(客户端电子邮件)"时发生异常:

SQLSTATE[HY000]:一般错误:1005 无法创建表"eship_case.#sql-81c_e"(errno:150)[Doctrine\DBAL\Exception\DriverException] 执行"更改表业务添加约束FK_8D36E3844FFE0C3外键 (client_email) 引用客户端(客户端电子邮件)
"时发生异常:

我知道这是一个MySQL错误,但我认为Doctrine会处理迁移,所以当它没有时,我不知道如何解决它。我可以在MySQL上手动执行模式来解决此问题,但我不知道这会如何影响Symfony中的ORM模式。很抱歉打扰,我是PHP的新手,因此是Symfony和Doctrine的新手。

原帖:我正在做一个使用Symfony Framework和MySQL作为数据库的Web应用程序。我正在使用学说来做ORM来映射数据库。但是,当我尝试更新数据库的架构以包含外键时,出现以下错误:1 我并没有真正理解这个错误,我将不胜感激任何人能给我的任何帮助。

下面是这两个类的代码。客户的主键是客户电子邮件,我想与业务实体建立该键的关系。我知道可能缺少一些文档,但我正在尝试在移动到该错误之前修复此错误。课程更长,但我只发布了可能导致问题的领域。

公务舱:

<?php
/**
* @ORMEntity
* @ORMTable(name="business")
*/
class Business
{
/**
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
* @ORMColumn(type="integer")
*/
private $businessId;
/**
* @ORMColumn(type="string")
*/
private $name;
/**
* @ORMColumn(type="string")
*/
private $stage_Of_Development;

//Relations
/**
* @ORMManyToOne(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
/**
* @ORMEntity
* @ORMTable(name="client")
*/
class Client
{
/**
* @ORMID
* @ORMColumn(type="string")
*/
private $clientEmail;    
/**
* @return mixed
*/
public function getClientEmail()
{
return $this->clientEmail;
}
/**
* @param mixed $clientEmail
*/
public function setClientEmail($clientEmail)
{
$this->clientEmail = $clientEmail;
}   
}

请在客户端字段添加连接列。

/**
* @ORMManyToOne(targetEntity="Client")
* @ORMJoinColumn(name="client_email", referencedColumnName="clientEmail")
*/
private $client;

默认情况下,原则将@ManyToOne映射到外来实体上的 id 字段。如果要覆盖它,则需要自行定义它:

class Business
{
// ...
/**
* @ORMManyToOne(targetEntity="Client")
* @ORMJoinColumn(name="client_email", referencedColumnName="clientEmail")
*/
private $client;
// ..
}

请看一下教义中的关联映射。

另请注意:您当前的映射无法确保ClientEmail的唯一性,如果有人两次添加相同的$clientEmail,这可能会破坏您的行为(取决于您的应用程序)。

相关内容

  • 没有找到相关文章

最新更新