为什么我的 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;