Doctrine left join wherejoined table is null 显示结果

use*_*829 5 doctrine symfony doctrine-orm

此查询的目标是显示尚未创建任何发货的表订单中的记录。以下是在 SQL 中应该如何完成:

SELECT *
FROM orders 
LEFT JOIN orders_shipments shipments ON orders.trx_id = shipments.trx_id
WHERE shipments.shipment_id IS NULL 
AND orders.purchase_date IS NOT NULL 
AND orders.fulfillment_channel = 'MFN';
Run Code Online (Sandbox Code Playgroud)

以下查询显示 0 个结果。对比以下:

$qb = $this->createQueryBuilder('orders');
        $qb->select('orders, shipments')
        ->leftjoin('orders.shipments', 'shipments')
        ->Where('shipments.id IS NULL')
        ->ANDWhere('orders.purchaseDate IS NOT NULL')
        ->ANDWhere('orders.fulfillmentChannel = :a')->setParameter('a', 'MFN');;
        $results = $qb->getQuery()
        ->getResult();
        return $results;
Run Code Online (Sandbox Code Playgroud)

显示结果。为什么会这样以及如何解决?

use*_*829 7

不知道为什么,但我不得不使用 GROUP 和 HAVING 来让它工作:

$qb = $this->createQueryBuilder('orders');
        $qb->select('orders, shipments')
        ->leftjoin('orders.shipments', 'shipments')
        ->Where('shipments.id IS NULL')
        ->ANDWhere('orders.purchaseDate IS NOT NULL')
        ->ANDWhere('orders.fulfillmentChannel = :a')->setParameter('a', 'MFN')
        ->GroupBy('orders.id')
        ->having('count(shipments) = 0');
        $results = $qb->getQuery()->getResult();
Run Code Online (Sandbox Code Playgroud)