2017-03-25 11 views
0

編集:移行:私は@MichaelHirschlerと@MayaShahが提案し、それが問題を解決し、それは私が教義を使用して教義の移行ファイルを作成することができます何をしたdiffコマンドが、私はこれらを移行しようとしたとき、 doctrine:migration:を使用してデータベースを変更すると、次のエラーが表示されます。ドクトリンORM例外

移行20170325192546実行中に失敗しました。

SQLSTATE [HY000]:一般的なエラー:テーブル」eship_caseを作成することはできません1005#のSQL-81c_e 'TABLE事業が制約FK_8D36E3844FFE0C3 FOREIGN KEY(client_email)REFERENCESクライアント(clientEmail)を追加ALTER' を実行中に例外が発生したエラー'(errnoに:150)を実行中に例外が発生しました
[DriverException \教義\ DBAL \例外] 'TABLE事業が制約FK_8D36E3844FFE0C3 FOREIGN KEY(client_email)REFERENCESクライアントを追加する(clientEmailを)ALTER':

私はこれがあることを理解MySQLのエラーですが、私はDoctrineがマイグレーションの世話をすると思っていました。そうしないと、それを修正する方法がわかりません。私はこれを修正するためにMySQL上で手動でスキーマを行うことができましたが、SymfonyのORMスキーマにどのような影響を与えるかはわかりません。申し訳ありませんが、私はPHPを初めて使い、SymfonyとDoctrineを初めて使用しています。

オリジナルポスト データベースとしてMySQLを使用するSymfony Frameworkを使用してWebアプリケーションを作成しています。私はデータベースをマップするためにORMを行うためにdoctrineを使用しています。しかし、外部キーを含むようにデータベースのスキーマを更新しようとすると、次のエラーが表示されます。1 私は実際にエラーを理解していません。

ここに、両方のクラスのコードを示します。クライアントの主キーは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

完全なSQL例外を投稿してください、それは隠されているかもしれませんが、私は何が起こっているかを伝えることはできません。 –

+0

次はコマンドラインの画像です:https://i.stack.imgur.com/i4StC.png –

+0

この回答を見てください:http://stackoverflow.com/a/4673775/6849366。一般的にDoctrineはうまくいっていますが、データベースの設定に何か問題があると思います。 –

答えて

1

クライアントフィールドの結合列を追加してください。

/** 
* @ORM\ManyToOne(targetEntity="Client") 
* @ORM\JoinColumn(name="client_email", referencedColumnName="clientEmail") 
*/ 
private $client; 
0

デフォルトでは、Doctrineは@ManyToOneを外部エンティティのidフィールドにマップします。あなたはそれを上書きしたい場合は、自分でそれを定義する必要があります。

class Business 
{ 
    // ... 

    /** 
    * @ORM\ManyToOne(targetEntity="Client") 
    * @ORM\JoinColumn(name="client_email", referencedColumnName="clientEmail") 
    */ 
    private $client; 

    // .. 
} 

Association Mapping in Doctrineについて見てみてください。

また、現在のマッピングではClientEmailの一意性が保証されていません。を2回追加すると、アプリケーションによっては動作が異なる可能性があります。

+0

助けてくれてありがとう、私はclientEmailの問題の一意性を世話した。今度は全体的な助けになると非常に役に立ちましたが、今度はスキーマをMySQLデータベースにインポートするときに新しいエラーが発生しました。私はSymfonyとDoctrineを初めて使っているので少し失われています。新しいエラーを反映するために元の投稿を編集しました。あなたがそれを見せることができれば、私はそれをとても高く評価します。 –