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はオブジェクトをフックしてデータで初期化しますが、前者のエラーが発生します。
誰かが私を助けてくれませんか?
さらに出力/情報が必要な場合は、お気軽にお問い合わせください。
手伝ってくれてありがとう!