我有两个实体,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
[...]
奥夫加贝:
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()
进行查询,否则它搜索"[...] 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
Version
因为它不是 null 而是一个未初始化的代理,所以我的自定义 finder 函数认为它是一个有效的版本......
...
在某处,我担心我做错了什么,但我现在没有看到它:) 也许我读错了一些东西并且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
我需要在第二个中查询显式键,else
因为 Doctrine 告诉我我无法搜索p.Version = :version
它是否具有复合键(引发错误)。