0

我有两个实体,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()返回?NULLAufgabeVersion

因为它不是 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它是否具有复合键(引发错误)。

4

0 回答 0