- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想请求您帮助 Doctrine2 DBAL
使用 QueryBuilder
构建的查询。我已经习惯了 ORM,但我认为对于在监听器中调用的此类查询来说,这是一种矫枉过正的做法。
我需要使用 SELECT EXISTS
进行查询我不知道如何使用 DBAL QueryBuilder
构建它.
我已经创建了一个子查询:
$subQuery = $connection->createQueryBuilder();
$subQuery
->select('o.id')
->from('order', 'o')
->leftJoin('o', 'payment', 'p')
->where($subQuery->expr()->isNull('p.id'))
;
我主要是想检查是否有未付款的订单。我现在不知道如何构建 SELECT EXISTS
询问?有人能指出我正确的方向吗?我在想这样的事情:
$qb->select('EXISTS(?)')->setParameter($subQuery->getDQL())
这是正确的解决方案吗?
@编辑
经过一段时间的思考,我决定使用 ORM。不幸的是,这也不起作用,我收到一个错误:
line 0, col 7: Error: Expected known function, got 'EXISTS'
DQL 是: SELECT EXISTS(<subquery here>)
考虑到它是用 QueryBuilder 构建的,这有点奇怪:
/* @var $qb QueryBuilder */
$qb = $this->em->createQueryBuilder();
$qb
->select($qb->expr()->exists($subQuery->getDQL()));
最佳答案
晚了几年,但您需要在 QueryBuilder 的 SELECT
或 WHERE
语句部分中指定 EXISTS
子查询 SQL,如下所示反对使用参数。
此外,由于 order
是 MySQL 中的保留字,因此您需要使用标识符引号 `
(反引号)来转义表名称。
使用 ORM 时;您必须指定引用实体的 FROM
语句,因此您需要更改方法。
$connection = $this->em->getConnection();
$expr = $connection->getExpressionBuilder();
$qbSub = $connection->createQueryBuilder()
->select('1')
->from('`order`', 'o')
->leftJoin('o', '`payment`', 'p', $expr->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();
生成的 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
);
Note: If you have any parameters, the values for the placeholders must be bound using
QueryBuilder::setParameter()
on the top-levelquery, not the sub-queries.
$qbSub = $connection->createQueryBuilder()
->select('1')
->from('`order`', 'o')
->leftJoin('o', '`payment`', 'p', $expr->andX(
$expr->eq('p.order_id', 'o.id'),
$expr->eq('p.name', ':name') // subquery placeholder
))
->where($expr->isNull('p.id'));
$connection->createQueryBuilder()
->select('EXISTS(' . $qbSub->getSQL() . ')')
->setParameter('name', $value) // subquery placeholder param value
->execute()
->fetchColumn();
但是,我建议将查询从排除联接更改为包含 NOT EXISTS
的包含联接。这样做将从结果集中过滤掉已付款的订单。而不是尝试加入每次付款的每个订单并检索返回 null
的付款。显着提高查询性能。
示例 db-fiddle
SELECT EXISTS (
SELECT 1
FROM `order` AS o
WHERE NOT EXISTS(
SELECT NULL
FROM `payment` AS p
WHERE p.order_id = o.id
)
)
关于mysql - Doctrine2 DBAL 存在查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41140768/
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
当我尝试将服务 @doctrine.orm.entity_manager 作为我的监听器 UserDeletionListener 的参数时发生错误。 我的服务: se.doctrine_listen
这个问题在这里已经有了答案: Laravel model with POINT/POLYGON etc. using DB::raw expressions (3 个回答) 1年前关闭。 我正在使用
我最近将一个Laminas项目从信条迁移1.4升级到3.6,并将信条-orm模块从1升级到5.3。在我的部署服务器上,当运行./vendor/bin/stasty-module sync-meta-s
我收到以下 SQL 的“基数冲突”错误: Doctrine\DBAL\Exception\DriverException: 执行时发生异常 SELECT p.* FROM mod_products_p
我想请求您帮助 Doctrine2 DBAL使用 QueryBuilder 构建的查询。我已经习惯了 ORM,但我认为对于在监听器中调用的此类查询来说,这是一种矫枉过正的做法。 我需要使用 SELEC
我想请求您帮助 Doctrine2 DBAL使用 QueryBuilder 构建的查询。我已经习惯了 ORM,但我认为对于在监听器中调用的此类查询来说,这是一种矫枉过正的做法。 我需要使用 SELEC
我正在使用 Doctrine 2,其中我有多个 DBAL 连接。我在 ORM 中也有多个 EntityManager。 我需要能够以某种方式将特定的 DBAL 连接自动连接到其他 Symfony 3
背景 我正在处理的应用程序目前全部使用 mysql_query 语句,我们希望迁移到 Doctrine DBAL。 mysql_query 函数有数千种用法,我们希望使用新的 DBAL 开始新的开发并
我刚刚将 Doctrine DBAL 安装到一个简单的测试 PHP 项目中,并创建了一个测试数据库并成功进行了一些查询。包括同时使用位置参数和命名参数的查询,例如: echo ''; echo 'Si
您好,我有一个在事务中工作的服务,它与远程 API 通信,我想记录此 API 中的每个请求/响应,但如果主事务回滚,任何日志也会回滚。 我的想法是克隆DBAL连接。它会打开第二个没有事务的连接,我可以
我正在尝试创建一个 Doctrine DBAL querybuilder 对象并在其中设置一个参数。(使用 postgres db,dbal 2.3.4, Doctrine $connection =
我将 Symfony2 框架与 Doctrine DBAL 结合使用,并将一些数据插入 MySql 数据库。插入看起来像这样(简化): $conn->insert('sometable', array
我有这个带有子查询的查询。 SELECT * FROM (SELECT module_id FROM an_modules AS m LIMIT 20 OFFSET 0) AS m LEFT JOIN
我正在使用 Doctrine 的枚举类型来跟踪我在 Symfony 应用程序中使用的实体的状态。我正在(大致)使用此处描述的方法: http://docs.doctrine-project.org/p
我不太明白如何在 DBAL 中进行事务处理 我有以下脚本,它根据行的 ID 更新列。我放置了一个表中不存在的假 ID,(因此无法进行更新)但是尽管这是一个事务,但第一个更新已提交。如果其中一个交易失败
是否可以使用 Doctrine DBAL 对 SQLite 数据库进行批量插入?即使以下操作更有效率: $twitter = new TwitterAPIExchange($twitterAuth);
我正在尝试使用 DBAL 查询生成器更新记录,但它似乎不起作用。我试图设置的 data 列只有在我将此处的 test 示例值替换为数字时才有效。 在那种情况下,它会完美地更新我的记录。 即使我也为它使
我有这个简单的例子: $names = ['a', 'b']; $query = $dbConnection->createQueryBuilder(); $query->select('*')
我有这个文件夹结构 [-] myapp/ [+] app/ [-] lib/ [-] vendor/ [-] doctrine/
我是一名优秀的程序员,十分优秀!