简体   繁体   中英

Symfony / Doctrine - How can I symplify this code?

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;

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM