sql >> Databáze >  >> RDS >> Mysql

Doctrine2 DBAL Existuje dotaz

O několik let později, ale musíte zadat EXISTS poddotaz SQL v rámci SELECT nebo WHERE část příkazu QueryBuilder, na rozdíl od použití parametru.

Navíc od order je vyhrazené slovo v MySQL, budete muset použít identifikátor uvozovek ` (zpětné zaškrtnutí) pro opuštění názvu tabulky.

Při použití ORM; musíte zadat FROM prohlášení, které odkazuje na entitu, takže budete muset změnit svůj přístup.

$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();

Výsledné 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
);

Navrhuji však změnit váš dotaz ze spojení vyloučení na spojení zahrnutí s NOT EXISTS . Tím odfiltrujete objednávky, které byly zaplaceny, ze sady výsledků. Místo toho, abyste se pokoušeli připojit každou objednávku u každé platby a načíst platby, které vrací null . Dramatické zlepšení výkonu dotazu.

Příklad 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. Předat ID tenanta přes připojení k serveru SQL

  2. PHP MySQL INSERT se nezdaří kvůli jedinečnému omezení

  3. Příkazový řádek a transakce MySQL

  4. Existuje v PostgreSQL nějaká hashovací funkce?