我正在尝试创建一个简单的查询,以便在一个查询中获取所有相关实体(请参阅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();
感谢任何提示。
答案 0 :(得分:4)
这个问题的原因一般都很容易。
我创建了不同的实体类,并在某些点添加了像空字符这样的默认值到类字段 这导致上述错误。
我已经完成了测试我的业务逻辑本地,没有任何数据库连接或与Behat类似。
删除空array()
解决了我的问题。
为了与Behat兼容我需要为该字段设置一个setter来重新设置一个空数组或扩展该类并添加一个构造函数来默认该字段。
也许其他人对此有另一种想法。