Symfony 具有一对多关系和多个使用原则的条件的QueryBuilder

Symfony 具有一对多关系和多个使用原则的条件的QueryBuilder,symfony,doctrine,entity-relationship,query-builder,Symfony,Doctrine,Entity Relationship,Query Builder,我会尽力解释我的问题。我有一条与另一个实体相关的消息,称为Reply(一条消息可以有零个或n个回复),我想考虑以下情况: 如果UserA向UserB创建了一条消息(UserA是创建者) 但是用户B没有回复消息我不想收到消息 与上面相同,但用户B回复了消息。我要拿到票 邮件及其答复(如果答复存在) 如果UserB向UserA发送了一条消息,我想用 如果存在答复,则返回其答复 我的消息实体(我将只放置OneToMany关系): 我不是一个用条令构建查询的专家,我不知道现在如何控制我的所有案例,如

我会尽力解释我的问题。我有一条与另一个实体相关的消息,称为Reply(一条消息可以有零个或n个回复),我想考虑以下情况:

  • 如果UserA向UserB创建了一条消息(UserA是创建者) 但是用户B没有回复消息我不想收到消息

  • 与上面相同,但用户B回复了消息。我要拿到票 邮件及其答复(如果答复存在)

  • 如果UserB向UserA发送了一条消息,我想用 如果存在答复,则返回其答复
  • 我的消息实体(我将只放置OneToMany关系):


    我不是一个用条令构建查询的专家,我不知道现在如何控制我的所有案例,如果有人能帮助我,我将非常感激

    这就是QueryBuilders的魅力所在。您可以创建如下语句:

    $query = $this->createQueryBuilder('message')
        ->where('message.creator = :username or message.receiver = :username')
        ->leftJoin('message.replies', 'replies')
        ->andWhere('replies.user = :username')
        ->setParameter('username', $username);
    
    if (some_condition) {
        $query->andWhere('some_property');
    }
    
    if (some_other_condition) {
        $query->andWhere('some_property');
    }
    
    return $query->getQuery()->getResults();
    

    不要使用
    ->getResult()在您的
    AppBundle\Repository\MessageRepository
    Repository中,因为有时您需要多次使用它,例如:
    BreadcrumbsBundle
    需要查询(不是结果,因为它受性能影响)

    不应该
    getrepries()
    已经有了每个回复,因为这是一个关系?也许自我参照关系也能帮助你变得更有活力。在条令页面中,他们以
    User
    为例。有时,您希望拥有“朋友”,而这些朋友也只是“用户”对象。因此,您可以将用户对象用作自引用。回复也是一条信息,因此我相信您也可以自行参考它,借助symfony的强大功能,您应该可以非常轻松地获取数据。
    $query = $this->createQueryBuilder('message')
        ->where('message.creator = :username or message.receiver = :username')
        ->leftJoin('message.replies', 'replies')
        ->andWhere('replies.user = :username')
        ->setParameter('username', $username)
        ->getQuery();
    
    $sent = $query->getResult();
    
    return $sent;
    
    $query = $this->createQueryBuilder('message')
        ->where('message.creator = :username or message.receiver = :username')
        ->leftJoin('message.replies', 'replies')
        ->andWhere('replies.user = :username')
        ->setParameter('username', $username);
    
    if (some_condition) {
        $query->andWhere('some_property');
    }
    
    if (some_other_condition) {
        $query->andWhere('some_property');
    }
    
    return $query->getQuery()->getResults();