为什么我的 PersistentCollection 是空的?
Why is my PersistentCollection empty?
我正在使用 Symfony 3 Framework with Doctrine 和 MongoDB。
我有两个处于一对多关系中的文档。
/**
* Class Waypoint
* @package AppBundle\Document
* @MongoDB\Document(collection="waypoints", repositoryClass="AppBundle\Repository\WaypointRepository")
*/
class Waypoint
{
/**
* @var int
*
* @MongoDB\Id(strategy="auto")
*/
private $id;
/**
* @var ArrayCollection
* @MongoDB\ReferenceMany(targetDocument="Comment", cascade={"delete"})
*/
private $comments;
}
**
* Class Comment
* @package AppBundle\Document
* @MongoDB\Document(collection="comments", repositoryClass="AppBundle\Repository\CommentRepository")
*/
class Comment
{
/**
* @var int
*
* @MongoDB\Id(strategy="auto")
*/
private $id;
/**
* @var Waypoint
*
* @MongoDB\ReferenceOne(targetDocument="Waypoint", inversedBy="comments")
* @Assert\NotBlank()
*/
private $waypoint;
}
现在我从存储库查询中获取了我的 Waypoint
条目的一部分,并希望用 twig 显示它们。
/**
* WaypointRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class WaypointRepository extends DocumentRepository
{
public function getWaypointsForCruiseByPage(Cruise $cruise, $page)
{
$displayLimit = 10;
$amountToSkip = 0;
if ($page > 1)
{
$amountToSkip = ($page -1) * $displayLimit;
}
$qb = $this->createQueryBuilder()
->select()
->field('cruise')->equals($cruise)
->field('isAutoWaypoint')->equals(false)
->sort('date', -1)
->skip($amountToSkip)
->limit($displayLimit)
;
$qb
->addOr($qb->expr()->field('hasImage')->equals(true))
->addOr($qb->expr()->field('hasAudio')->equals(true))
->addOr($qb->expr()->field('description')->notEqual(''))
;
return $qb->getQuery()->toArray();
}
}
现在,我正在尝试 {{ waypoint.comments.count }}
或 {{ waypoint.comments|length }}
将始终为 0,即使我的 MongoDB 集合中有数据集也是如此。
如果我通过 Waypoint 的 ID 通过 CommentRepository 获取评论,我将获得预期的结果。
// returns the expected results
public function getAllCommentsForWaypoint(Waypoint $waypoint)
{
return $this->createQueryBuilder()
->select()
->field('waypoint')->equals($waypoint)
->getQuery()->toArray()
;
}
据我所知,映射很好,没有发现缺陷或错误。
为什么PersistentCollection 是空的,虽然集合中有事件信息?
我不确定您是如何创建文档的,但这是我的最佳选择:
Waypoint::$comments
未映射为反面,因此 ODM 期望参考列表在数据库的 waypoint.comments
字段中可用。它很可能不存在(即您没有明确地将新 Comment
添加到 Waypoint
中的集合),这就是为什么您在查询 waypoints 时看到空集合,但是查询评论时的结果。鉴于你在 Comment
映射中有 inversedBy="comments"
我认为你忘记将 Waypoint::$comments
设置为反面:
/**
* @var ArrayCollection
* @MongoDB\ReferenceMany(targetDocument="Comment", mappedBy="waypoint")
*/
private $comments;
我正在使用 Symfony 3 Framework with Doctrine 和 MongoDB。
我有两个处于一对多关系中的文档。
/**
* Class Waypoint
* @package AppBundle\Document
* @MongoDB\Document(collection="waypoints", repositoryClass="AppBundle\Repository\WaypointRepository")
*/
class Waypoint
{
/**
* @var int
*
* @MongoDB\Id(strategy="auto")
*/
private $id;
/**
* @var ArrayCollection
* @MongoDB\ReferenceMany(targetDocument="Comment", cascade={"delete"})
*/
private $comments;
}
**
* Class Comment
* @package AppBundle\Document
* @MongoDB\Document(collection="comments", repositoryClass="AppBundle\Repository\CommentRepository")
*/
class Comment
{
/**
* @var int
*
* @MongoDB\Id(strategy="auto")
*/
private $id;
/**
* @var Waypoint
*
* @MongoDB\ReferenceOne(targetDocument="Waypoint", inversedBy="comments")
* @Assert\NotBlank()
*/
private $waypoint;
}
现在我从存储库查询中获取了我的 Waypoint
条目的一部分,并希望用 twig 显示它们。
/**
* WaypointRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class WaypointRepository extends DocumentRepository
{
public function getWaypointsForCruiseByPage(Cruise $cruise, $page)
{
$displayLimit = 10;
$amountToSkip = 0;
if ($page > 1)
{
$amountToSkip = ($page -1) * $displayLimit;
}
$qb = $this->createQueryBuilder()
->select()
->field('cruise')->equals($cruise)
->field('isAutoWaypoint')->equals(false)
->sort('date', -1)
->skip($amountToSkip)
->limit($displayLimit)
;
$qb
->addOr($qb->expr()->field('hasImage')->equals(true))
->addOr($qb->expr()->field('hasAudio')->equals(true))
->addOr($qb->expr()->field('description')->notEqual(''))
;
return $qb->getQuery()->toArray();
}
}
现在,我正在尝试 {{ waypoint.comments.count }}
或 {{ waypoint.comments|length }}
将始终为 0,即使我的 MongoDB 集合中有数据集也是如此。
如果我通过 Waypoint 的 ID 通过 CommentRepository 获取评论,我将获得预期的结果。
// returns the expected results
public function getAllCommentsForWaypoint(Waypoint $waypoint)
{
return $this->createQueryBuilder()
->select()
->field('waypoint')->equals($waypoint)
->getQuery()->toArray()
;
}
据我所知,映射很好,没有发现缺陷或错误。
为什么PersistentCollection 是空的,虽然集合中有事件信息?
我不确定您是如何创建文档的,但这是我的最佳选择:
Waypoint::$comments
未映射为反面,因此 ODM 期望参考列表在数据库的 waypoint.comments
字段中可用。它很可能不存在(即您没有明确地将新 Comment
添加到 Waypoint
中的集合),这就是为什么您在查询 waypoints 时看到空集合,但是查询评论时的结果。鉴于你在 Comment
映射中有 inversedBy="comments"
我认为你忘记将 Waypoint::$comments
设置为反面:
/**
* @var ArrayCollection
* @MongoDB\ReferenceMany(targetDocument="Comment", mappedBy="waypoint")
*/
private $comments;