尝试访问可空关联时出错

时间:2012-11-23 13:27:55

标签: php symfony doctrine-orm lazy-loading

我有两个实体,AufgabeVersion与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(抛出错误)。

0 个答案:

没有答案