doutui4649
2016-05-26 12:24
浏览 37
已采纳

Symfony / Doctrine - 如何解释此代码?

I have two Tables in symfony join by ManyToOne bidirectional relationship. articles and dates.

I have in result ALL the articles except a.id : 4 because one of them doesn't respond to the condition.

I found the solution but how can I symplify it ? I know it's not optimised. And I would like to.

In my table (dates) i have :

+----------------------------
| id   | a.id  | OK OR NOT ? 
+----------------------------
| 1    | 4     |      OK 
| 2    | 4     |      OK 
| 3    | 6     |      OK 
| 4    | 5     |      OK 
| 5    | 4     |   **NOTOK** 
----------------------------

    $qb = $this->createQueryBuilder('a');
    $allIndispo = $qb
        ->select('a.id')
        ->leftJoin('a.dates','d')
        ->where('**NOTOK**')
        ->orderBy('a.id', 'ASC')
        ->getQuery()
        ->getResult();

    $allIndispoId = array();
    foreach ($allIndispo as $key => $value) {
        foreach ($allIndispo[$key] as $key2 => $value2) {
            $allIndispoId[] = $value2;
        }
    }

    $allDispo = $this->createQueryBuilder('a')
        ->select('a')
        ->where($qb->expr()->notIn('a.id', "'".implode($allIndispoId, "', '")."'"))
        ->getQuery()
        ->getResult();

    return $allDispo;
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • dongyupen6269 2016-05-26 12:58
    已采纳

    Try to use the first query as subquery for the second, as example:

    $qb = $this->createQueryBuilder('a2');  //We need a different alias here
        $allIndispo = $qb
            ->select('a2.id')
            ->leftJoin('a2.dates','d')
            ->where('**NOTOK**') // so take care to change the table alias here also
            ->orderBy('a2.id', 'ASC');
    
    
    $allDispo = $this->createQueryBuilder('a')
        ->select('a')
        ->where($qb->expr()->notIn('a.id', $subQuery->getDQL()))
        ->getQuery()
        ->getResult();
    
    return $allDispo;
    

    Hope this help

    已采纳该答案
    打赏 评论

相关推荐 更多相似问题