左连接遇到“在PersistentCollection中的非对象上调用成员函数add()”

时间:2014-08-29 16:19:25

标签: symfony doctrine-orm

我正在尝试创建一个简单的查询,以便在一个查询中获取所有相关实体(请参阅Doctrine - Get entity and relationships in one query)。由于某些原因,学说遇到了错误:

  

在非对象中调用成员函数add()   PersistentCollection

完整的堆栈跟踪:

Error: Call to a member function add() on a non-object in \vendor\doctrine\orm\lib\Doctrine\ORM\PersistentCollection.php line 177
    at n/a
        in \vendor\doctrine\orm\lib\Doctrine\ORM\PersistentCollection.php line 177
    at Doctrine\ORM\PersistentCollection->hydrateAdd()
        in \vendor\doctrine\orm\lib\Doctrine\ORM\Internal\Hydration\ObjectHydrator.php line 456
    at Doctrine\ORM\Internal\Hydration\ObjectHydrator->hydrateRowData()
        in \vendor\doctrine\orm\lib\Doctrine\ORM\Internal\Hydration\ObjectHydrator.php line 179
    at Doctrine\ORM\Internal\Hydration\ObjectHydrator->hydrateAllData()
        in \vendor\doctrine\orm\lib\Doctrine\ORM\Internal\Hydration\AbstractHydrator.php line 140
    at Doctrine\ORM\Internal\Hydration\AbstractHydrator->hydrateAll()
        in \vendor\doctrine\orm\lib\Doctrine\ORM\AbstractQuery.php line 804
    at Doctrine\ORM\AbstractQuery->execute()
        in \vendor\doctrine\orm\lib\Doctrine\ORM\AbstractQuery.php line 574
    at Doctrine\ORM\AbstractQuery->getResult()

组映射:

Group:
  type: entity
  table: groups
  id:
    id:
      type: integer
      generator:
        strategy: AUTO
  oneToMany:
    influences:
      targetEntity: Influence
      mappedBy: group
      cascade: [ "persist" ]

影响力映射:

Influence:
  type: entity
  table: influences
  id:
    organisation:
      associationKey: true
    group:
      associationKey: true

  fields:
    influence:
      type: integer

  manyToOne:
    organisation:
      targetEntity: Organisation
      inversedBy: influences
    group:
      targetEntity: Group
      inversedBy: influences

这是我的查询构建器逻辑:

$builder->select('g, i')
->from('Group', 'g')
->join('g.game', 'game')
->leftJoin('g.influences', 'i', Join::WITH, 'i.organisation = :org')
->setParameter('org', $organisation)
->orderBy('g.name')
->getQuery();

感谢任何提示。

1 个答案:

答案 0 :(得分:4)

这个问题的原因一般都很容易。

我创建了不同的实体类,并在某些点添加了像空字符这样的默认值到类字段 这导致上述错误。

我已经完成了测试我的业务逻辑本地,没有任何数据库连接或与Behat类似。

删除空array()解决了我的问题。

为了与Behat兼容我需要为该字段设置一个setter来重新设置一个空数组或扩展该类并添加一个构造函数来默认该字段。
也许其他人对此有另一种想法。