私はSymfony2の実体関連の最初の一歩を踏み出しました。それぞれに1つのメーターと1つのモニターがあるエンティティインストールがあります。
これは、私が次のように定義した一方向の関係に変換されます。
/**
*
* @ORM\OneToOne(targetEntity="InfoMeter")
* @ORM\JoinColumn(name="meterid", referencedColumnName="id")
*/
private $meter;
/**
*
* @ORM\OneToOne(targetEntity="InstallationsRtu")
* @ORM\JoinColumn(name="monitorid", referencedColumnName="id")
*/
private $monitor;
各モニターは、1つのインストールにのみ割り当てることができます。各メーターは、複数の設備に割り当てることができます。
データベースを更新すると(app / console doctrine:schema:update --force)、2つの結果があります。
モニターの場合:
すべてが正常に行われると、スキーマは接頭辞「UNIQ_」が付いたキー名で更新されます。
メーターの場合:次のエラーが発生します
PDOException]
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'UNIQ_43D26968860BE41D'
このエラーが発生した後のテーブル構造を見ると、前述の制約は見つかりませんが、FK_43D26968860BE41D、つまり同じですが、接頭辞が「FK」であることがわかります。
インストールテーブルに、次のリストがあります。
Keyname Type Unique Packed Field Cardinality
PRIMARY BTREE Yes No id 2
UNIQ_43D26968701EC1AB BTREE Yes No monitorid 2
FK_43D26968860BE41D BTREE No No meterid 2
つまり、1つは「Unique = Yes」と言い、もう1つは「Unique=No」と言います。
私の質問にたどり着くには:
それがUNIQインデックスであるかFKインデックスであるかをどのように判断できますか?Doctrineは、現在、各monitoridがインストールテーブルで一意であることを確認したと思いますが、各meteridはインストールテーブルで数回発生します。
したがって、最初はUNIQを使用し、後者はFKを使用しました。しかし、私はこれをどうにかして制御できますか?