sql >> Database >  >> RDS >> Mysql

Doctrine2 DBAL Bestaat query

Een paar jaar te laat, maar je moet je EXISTS . opgeven subquery SQL binnen de SELECT of WHERE instructiegedeelte van de QueryBuilder, in tegenstelling tot het gebruik van een parameter.

Bovendien sinds order is een gereserveerd woord in MySQL, u moet identifier-aanhalingstekens gebruiken ` (back-tick) om te ontsnappen aan de tabelnaam.

Bij gebruik van de ORM; je moet een FROM . opgeven verklaring die verwijst naar een entiteit, dus u zou uw benadering moeten veranderen.

$connection = $this->em->getConnection();
$expr = $connection->getExpressionBuilder();
$qbSub = $connection->createQueryBuilder()
    ->select(['1'])
    ->from('`order`', 'o')
    ->leftJoin('o', '`payment`', 'p', $exor->eq('p.order_id', 'o.id'))
    ->where($expr->isNull('p.id'));

/**
 * @return string "1" if a record exists, "0" otherwise
 */
$connection->createQueryBuilder()
    ->select('EXISTS(' . $qbSub->getSQL() . ')')
    ->execute()
    ->fetchColumn();
$qb
    ->setParameter('name', $value)
    ->execute();

Resulterende SQL

SELECT EXISTS(
   SELECT 1
   FROM `order` AS o
   LEFT JOIN `payment` AS p
   ON p.order_id = o.id
   WHERE p.id IS NULL
);

Ik stel echter voor om uw zoekopdracht te wijzigen van een uitsluitings-join naar een inclusie-join met NOT EXISTS . Als u dit doet, worden de bestellingen die zijn betaald, uit uw resultatenset gefilterd. In plaats van te proberen elke bestelling bij elke betaling te voegen en de betalingen op te halen die null teruggeven . Drastische verbetering van de prestaties van de zoekopdracht.

Voorbeeld db-fiddle

SELECT EXISTS (
    SELECT 1
    FROM `order` AS o2
    WHERE NOT EXISTS(
        SELECT NULL
        FROM `order` AS o
        INNER JOIN `payment` AS p
        ON p.order_id = o.id
        WHERE o2.id = o.id
    )
)



  1. door komma's gescheiden waarde converteren naar meerdere rijen

  2. De Chamilo MySQL-database implementeren voor hoge beschikbaarheid

  3. Laravel Database Schema, Nullable Foreign

  4. De eerst opgetreden waarde uit de XML halen met behulp van orakelparser