5

Symfony 2.1.2 を使用しています。

2 つのエンティティがあり、[多対 1 (双方向)] (1) の関連付けを定義します。主キーを外部キー (referencedColumnName) に使用したくありません。別の整数の一意の列を使用したい: customer_no

/**
 * @ORM\Entity
 * @ORM\Table(name="t_myuser")
 */
class MyUser extends BaseEntity // provides an id (pk)
{
    /**
     * @ORM\ManyToOne(targetEntity="Customer", inversedBy="user")
     * @ORM\JoinColumn(name="customer_no", referencedColumnName="customer_no", nullable=false)
     */
    public $customer;
}

/**
 * @ORM\Entity
 * @ORM\Table(name="t_customer")
 */
class Customer extends BaseEntity // provides an id (pk)
{
    /**
     * @ORM\Column(type="integer", unique=true, nullable=false)
     */
    public $customer_no;

    /**
     * @ORM\OneToMany(targetEntity="MyUser", mappedBy="customer")
     */
    public $user;
}

MyUser エンティティを Customer エンティティで永続化しようとすると、次のエラーが発生します。

Notice: 未定義のインデックス: customer_no in ...\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\BasicEntityPersister.php 行 608

データベースのスキーマは正常に見えます。これらは重要な SQL スキーマ定義である必要があります。

CREATE UNIQUE INDEX UNIQ_B4905AC83CDDA96E ON t_customer (customer_no);
CREATE INDEX IDX_BB041B3B3CDDA96E ON t_myuser (customer_no);
ALTER TABLE t_myuser ADD CONSTRAINT FK_BB041B3B3CDDA96E FOREIGN KEY (customer_no) 
  REFERENCES t_customer (customer_no) NOT DEFERRABLE INITIALLY IMMEDIATE;

したがって、確実にcustomer_noのインデックスがあります

//更新: inversedBy と MappedBy を修正しましたが、これは問題ではありません。

(1) : http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to-many-bidirectional

4

1 に答える 1

2

@m2mdas:はい、その通りです。ドクトリンに影響を与える JPA にこの機能が
あるため、可能だと思いました。プロパティがテーブルの列と一致しない場合のみの属性。referencedColumnName

とにかく、BasicEntityPersister.php にパッチを適用することで解決策を見つけました。こちらの github の要点を参照してください: https://gist.github.com/3800132

解決策は、マッピング列のプロパティ/フィールド名と値を追加することです。この情報はすでに存在していますが、適切な場所にバインドされていません。この方法で$newValId配列に追加する必要があります。

$fieldName = $targetClass->getFieldName($targetColumn);
$newValId[$fieldName] = $targetClass->getFieldValue($newVal, $fieldName);

ManyToOne 参照でのみ機能します。多対多は機能しません。
ManyToOne の場合、既存のエンティティでテストします。あなたもそれをテストすることができます:

tests/Doctrine/Tests/Models/Legacy/LegacyArticle.php
からの教義注釈を変更します

@JoinColumn(name="iUserId", referencedColumnName="iUserId")

@JoinColumn(name="username", referencedColumnName="sUsername")
于 2012-09-30T14:43:04.770 に答える