2

私は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を使用しました。しかし、私はこれをどうにかして制御できますか?

4

1 に答える 1

4

1つのメッターを複数のインストールに割り当てることができる場合は、OneToMany関係を定義する必要がありますか?

インストールエンティティの場合:

/**
 * @ORM\ManyToOne(targetEntity="InfoMeter", inversedBy="installations")
 * @ORM\JoinColumn(name="infometer_id", referencedColumnName="id")
 */
protected $info_meter;

そして、InfoMeterエンティティで:

/**
 * @ORM\OneToMany(targetEntity="Installation",mappedBy="info_meter")
 */
protected $installations;

さらに、InfoMeterクラスコンストラクターに以下を追加する必要があります。

function __construct() {
   [...]
   $this->installations = new \Doctrine\Common\Collections\ArrayCollection();
}

このアプローチは、「インストール」と「メーター」の関係をどのようにしたいかによって改善できると確信していますが、これは機能するはずです。

于 2011-10-09T17:58:02.813 に答える