1

Doctrineを使用して問題を解決し、追加のフィールドを使用して多対多の関連付けを実装しようとしています。

詳細-次のようになります。

Person-Person_Project-プロジェクト

  • 1人が複数のプロジェクトに参加できます
  • 複数の人が1つのプロジェクトに参加できます
  • 人にはプロジェクト固有の役割があります

これは、次のセットアップで正常に機能するようです。

  • 3つの教義の実体
  • Person-> OneToMany-> Person_Project
  • プロジェクト->OneToMany->Person_Project

これらの関連付けはすべて双方向であり、次のように構成されています。

Person.phpの場合:

/**
 * @Id @GeneratedValue @Column(name="PersonenNr", type="integer")
 */
protected $id;

/**
 * @OneToMany(targetEntity="PersonProject", mappedBy="person", cascade={"PERSIST"})
 */
protected $personProjects = null;

public function __construct() {
    $this->personProjects = new ArrayCollection();
}

public function getProjects() {
    $projects = new ArrayCollection();
    foreach ($this->personProjects as $pp) {
        $projects->add($pp->project);
    }
    return $projects;
}

Project.phpの場合:

/**
 * @Id @Column(name="ProjectId", type="string")
 */
protected $id;

/**
 * @OneToMany(targetEntity="PersonProject", mappedBy="project", cascade={"PERSIST"})
 */
protected $personProjects = null;

public function __construct() {
    $this->personProjects = new ArrayCollection();
}

そしてPersonProject.phpで:

/**
 * @Id
 * @ManyToOne(targetEntity="Person", inversedBy="personProjects")
 * @JoinColumn(name="PersonId", referencedColumnName="PersonId")
 */
protected $person = null;

/**
 * @Id
 * @ManyToOne(targetEntity="Project", inversedBy="personProjects")
 * @JoinColumn(name="ProjectId", referencedColumnName="ProjectId")
 */
protected $project = null;

今、私の問題はそれらを使用するときに始まります。DBからPerson-Objectを取得したら、このPersonが割り当てられているプロジェクトだけを取得してから、このプロジェクトのプロパティだけにアクセスしようとすると、次のエラーが発生します。

Error in File: /usr/share/php/Doctrine/ORM/ORMException.php
Line: 60
Text: Unrecognized field:
Trace:
#0 /usr/share/php/Doctrine/ORM/Persisters/BasicEntityPersister.php(1231): Doctrine\ORM\ORMException::unrecognizedField('')
#1 /usr/share/php/Doctrine/ORM/Persisters/BasicEntityPersister.php(853): Doctrine\ORM\Persisters\BasicEntityPersister->_getSelectConditionSQL(Array, NULL)
#2 /usr/share/php/Doctrine/ORM/Persisters/BasicEntityPersister.php(568): Doctrine\ORM\Persisters\BasicEntityPersister->_getSelectEntitiesSQL(Array, NULL, 0)
#3 /tmp/DBProjectProxy.php(31): Doctrine\ORM\Persisters\BasicEntityPersister->load(Array, Object(DoctrineProxies\DBProjectProxy))
#4 /tmp/DBProjectProxy.php(41): DoctrineProxies\DBProjectProxy->__load()
#5 /home/[...]/project-data.html (12): DoctrineProxies\DBProjectProxy->getName()
... (just our internal call-hierarchy)
{main}

デバッグ中に、正しいPerson_Project-Entitiesが取得されていることがわかりますが、すべてのプロジェクトがDoctrineProxiesに置き換えられています。それらのプロパティを使用しようとするとすぐに、Doctrineはオブジェクトをフックしてデータで初期化しますが、前者のエラーが発生します。

誰かが私を助けてくれませんか?

さらに出力/情報が必要な場合は、お気軽にお問い合わせください。

手伝ってくれてありがとう!

4

1 に答える 1

0

この問題は、次のエラーによって引き起こされました: データベースには大文字の列名が含まれているため、Doctrine の BasicEntityPersister の行 1591 は、実際には「Projektkennung」と呼ばれているため、「projektkennung」と呼ばれる主キーを見つけることができませんでした。

必ず大文字と小文字を区別して列名を入力してください!! 他のすべては正常に機能し、深いデバッグのみが問題の解明に役立ちました。

私を助けようとしてくれた@mezeに感謝します:)

于 2013-03-05T13:26:41.180 に答える