我正在使用 QueryBuilder 将查询迁移到 doctrine 。我使用子查询查询内部联接,我想知道如何使用 doctrine 执行此操作。
SELECT p.*
FROM produtos p
INNER JOIN
(
SELECT e.*, d.id_deposito, d.quantidade, d.qtde_temp, d.valor_produto, d.valor, d.valor_representante_produto, d.valor_representante, d.id_erp
FROM produtos_estoque e
INNER JOIN depositos_produtos_estoque d ON e.id_estoque = d.id_estoque
WHERE e.inativo = '0' AND e.excluido = '0' AND d.excluido = '0' AND d.id_deposito = '1' AND d.inativo = 0 AND d.valor != '0.00'
) e ON p.id_produto = e.id_produto
转移到 doctrine 我想到了以下解决方案,但是它没有按照以下方式工作,我已经研究过但是我没有找到适用于 doctrine 2 的解决方案
$qb_estoque = $this->entityManager->createQueryBuilder();
$qb_estoque->select("e, d1.id_deposito, d.quantidade, d.qtde_temp, d.valor_produto, d.valor, d.valor_representante_produto, d.valor_representante, d.id_erp")
->from(\model\entity\Produtos_estoque::get_class_name(), "e")
->innerJoin(\model\entity\Depositos_produtos_estoque::get_class_name(), "d", Join::WITH, "e.id_estoque = d.produtos_estoque")
->innerJoin("d.depositos", "d1")
->where($qb_estoque->expr()->andX(
$qb_estoque->expr()->eq("e.inativo", 0),
$qb_estoque->expr()->eq("e.excluido", 0),
$qb_estoque->expr()->eq("d.inativo", 0),
$qb_estoque->expr()->eq("d.excluido", 0),
$qb_estoque->expr()->eq("d1.id_deposito", 1),
$qb_estoque->expr()->neq("d.valor", 0)
));
$qb = $this->entityManager->createQueryBuilder();
$qb->select("p")
->from(\model\entity\Produtos::get_class_name(), "p")
->innerJoin(sprintf("(%s)", $qb_estoque->getQuery()->getSQL()).")", 'e', Join::WITH, 'p.id_produto = e.produtos');
注意:是的,应该使用子查询来完成,因为查询的其余部分需要使用子查询中包含的信息。