Doctrine ORM Exception

时间:2017-03-25 06:35:40

标签: php mysql symfony doctrine-orm doctrine

编辑:我做了@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;
    }   
}

2 个答案:

答案 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两次,这可能会破坏您的行为。