我有两个实体,Aufgabe
和Version
与oneToMany-Relation(一个Version
可以有多个Aufgaben
),但它是可选,表示Aufgabe
无需分配Version
。以下是两者的YAML映射:
版本:
evenos\Bundle\TimeBundle\Entity\Version:
type: entity
repositoryClass: evenos\Bundle\TimeBundle\Repository\VersionRepository
table: version
id:
id:
type: integer
Projekt:
associationKey: true
fields:
nummer:
type: string
length: 20
nullable: false
beschreibung:
type: text
nullable: true
faktor:
type: decimal
precision: 2
scale: 1
uniqueConstraints:
version_nr_unique:
columns: nummer
oneToMany:
Aufgaben:
targetEntity: Aufgabe
mappedBy: Version
[...]
Aufgabe:
evenos\Bundle\TimeBundle\Entity\Aufgabe:
type: entity
repositoryClass: evenos\Bundle\TimeBundle\Repository\AufgabeRepository
table: aufgabe
id:
id:
type: integer
generator:
strategy: AUTO
fields:
name:
type: string
length: 40
beschreibung:
type: text
nullable: true
faktor:
type: decimal
precision: 2
scale: 1
soll_aufwand:
type: integer
oneToMany:
[...]
manyToOne:
[...]
Version:
targetEntity: Version
inversedBy: Aufgaben
joinColumns:
- name: projekt_nummer
nullable: true
referencedColumnName: projekt_nummer
- name: version_id
nullable: true
referencedColumnName: id
在我的AufgabeRepository
我有自定义方法findAufgabenByProjektAndVersion($projekt = null, $version = null)
- 如果$version
是版本对象,则使用其ID $version->getId()
进行查询,否则搜索{{} 1}}。
问题:因为从"[...] where version is null"
到Aufgabe
的关联是可选的(Version
),有时nullable: true
是$whatever->getAufgabe()->getVersion()
。或者应该是。相反,当我将其传递给我的存储库函数并且null
没有设置Aufgabe
时,我收到错误:
Version
我查看了代理类,提到的行是:
Notice: Undefined index: id in /home/manuel/project/zeiterfassung/dev/app/cache/dev/doctrine/orm/Proxies/__CG__evenosBundleTimeBundleEntityVersion.php line 54
显然代理对象没有初始化...但如果public function getId()
{
if ($this->__isInitialized__ === false) {
return (int) $this->_identifier["id"];
}
$this->__load();
return parent::getId();
}
没有分配..->getAufgabe()->getVersion()
,则不应NULL
返回Aufgabe
因为它不是null而是未初始化的代理,我的自定义查找功能认为它是一个有效的版本......
...
Somwhere,我做的事情非常糟糕,我担心,但我现在没有看到它:)
也许我错过了一些内容并且Version
不被允许用于关联?
更新:nullable: true
中的findAufgabenByProjektAndVersion
方法:
AufgabeRepository
我需要查询第二个public function findAufgabenByProjektAndVersion(Projekt $projekt = NULL, Version $version = NULL)
{
$qb = $this->getEntityManager()->createQueryBuilder()->addSelect('A')
->from('evenosTimeBundle:Aufgabe', 'A')
->leftJoin('A.Version', 'V');
if (is_null($projekt))
{
$qb->where('A.Projekt is null');
}
else
{
$qb->where('A.Projekt is null OR A.Projekt = :projekt')->setParameter('projekt', $projekt);
}
if (is_null($version))
{
$qb->andWhere('V.nummer is null');
}
else
{
$qb->andWhere('V.nummer is null OR (V.Projekt = :vprojekt AND V.id = :vid)')
->setParameter('vprojekt', $projekt)
->setParameter('vid', $version->getId());
}
return $qb->getQuery()->getResult();
}
中的显式Version
- 键,因为Doctrine告诉我如果它有一个复合键我就无法搜索else
(抛出错误)。