1

我正在尝试使用 Doctrine 解决我的问题并使用附加字段实现多对多关联。

更详细 - 它看起来像这样:

人员 - Person_Project - 项目

  • 一个人可以参与多个项目
  • 几个人可以成为一个项目的一部分
  • 人员具有项目特定的角色

这似乎与以下设置正常工作:

  • 3 教义实体
  • 人 -> 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;

现在我的问题从使用它们开始。从数据库中检索到 Person-Object 后,尝试获取分配此人的任何项目,然后尝试访问该项目的任何属性,遇到以下错误:

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 回答