在 Propel 1.5 中执行多个条件的连接

2024-01-01

这个问题是从问题而来的here https://stackoverflow.com/questions/6877226/rewriting-not-in-sub-select-as-join-for-propel and here https://stackoverflow.com/questions/6878380/use-of-propels-addmultiplejoin.

我最近升级到 Propel 1.5,并开始使用它的 Criteria 查询功能。但是,我有一个无法翻译的查询 - 具有多个条件的左连接:

SELECT * FROM person
LEFT JOIN group_membership ON
  person.id = group_membership.person_id
  AND group_id = 1
WHERE group_membership.person_id is null;

其目的是找到所有不属于指定组的人。以前我使用以下代码来完成此操作:

$criteria->addJoin(array(
  self::ID,
  GroupMembershipPeer::GROUP_ID,
), array(
  GroupMembershipPeer::PERSON_ID,
  $group_id,
),
Criteria::LEFT_JOIN);
$criteria->add(GroupMembershipPeer::PERSON_ID, null, Criteria::EQUAL);

我考虑对该组中的所有人执行查询,获取主键并添加NOT IN在数组上,但似乎没有一种特别简单的方法可以从查找中获取主键,而且看起来不是很优雅。

一篇关于Codenugget.org http://codenugget.org/building-multiple-join-conditions-with-propel详细说明了如何向连接添加额外的条件,我尝试过:

$result = $this->leftJoin('GroupMembership');
$result->getJoin('GroupMembership')
  ->addCondition(GroupMembershipPeer::GROUP_ID, $group->getId());
return $result
  ->useGroupMembershipQuery()
    ->filterByPersonId(null)
  ->endUse();

不幸的是,“useGroupMembershipQuery”覆盖了左连接。为了解决这个问题,我尝试了以下代码:

$result = $this
  ->useGroupMembershipQuery('GroupMembership', Criteria::LEFT_JOIN)
    ->filterByPersonId(null)
  ->endUse();
$result->getJoin('GroupMembership')
  ->addCondition(GroupMembershipPeer::GROUP_ID, $group->getId());
return $tmp;

由于某种原因,这会导致由于某种原因执行交叉连接:

SELECT * FROM `person`
CROSS JOIN `group_membership`
LEFT JOIN group_membership GroupMembership ON
  (person.ID=GroupMembership.PERSON_ID
  AND group_membership.GROUP_ID=3)
WHERE group_membership.PERSON_ID IS NULL

有谁知道为什么会这样做,或者如何在 Propel 1.5 中成功执行此连接,而不必再次求助于 Criteria?


Propel 1.6 支持多种连接条件addJoinCondition() http://trac.propelorm.org/wiki/Documentation/1.6/WhatsNew#JoinWithSeveralConditions。如果您更新 Symfony 插件,或移至sfPropelORM插件 http://www.symfony-project.org/plugins/sfPropelORMPlugin,您可以利用这一点。然后查询可以这样写:

return $this
  ->leftJoin('GroupMembership')
  ->addJoinCondition('GroupMembership', 'GroupMembership.GroupId = ?', $group->getId())
  ->where('GroupMembership.PersonId IS NULL');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Propel 1.5 中执行多个条件的连接 的相关文章

随机推荐

  • Firefox 中带有 javascript 的客户端 xslt

    我正在使用客户端 xslt 将 xml 文件转换为 xhtml 虽然遇到了一些障碍 但除了这个之外 我已经克服了所有障碍 问题是当我有一个像这样的简单 xml 文件时
  • 通过扩展更新 VS Code 用户设置

    我正在尝试创建一个简单的扩展来切换 VS Code 中测试文件的可见性 这是我目前的方法 const testGlobs tests mocks spec js function hideTests const exclude worksp
  • 特定文件的自定义 HTTP 标头

    我正在尝试通过 htaccess 文件为特定文件设置标头 以便让我的服务工作人员访问我的根目录 不幸的是 我没有看到标题出现 也许我没有瞄准该文件 https www stefanklokgieters nl wp content them
  • 如何使用 Atlassian Confluence 的 REST API 发表评论?

    我正在尝试使用 REST API 自动向页面添加评论 我正在使用 Postman 进行测试 我指向这个网址 https atlassian net wiki rest api content https atlassian net wiki
  • 取消投影对象拾取的结果

    网络上有很多对此的参考 包括来自 stackoverflow 的参考 我有一个 unproject 方法 它返回 x y 坐标 返回范围为 1 和 1 我想知道这些值是否正确 如果是这样 那么我该如何处理这些值 乘以相机位置 参考 如何将屏
  • 使用 sklearn 通过 Keras 数据生成器绘制混淆矩阵

    Sklearn 明确定义了如何使用自己的分类模型绘制混淆矩阵plot confusion matrix https scikit learn org stable auto examples model selection plot con
  • componentDidUpdate 与 componentDidMount

    当满足以下条件时 我需要确保输入元素获得焦点 DOM 可用 并且属性发生了变化 问题 我需要将我的代码放入两个中吗componentDidUpdate and componentDidMount要不就componentDidUpdate就足
  • 如何在轴标签和图例中的下标中写入文本?

    我有以下轴标签和图例 plt ylabel ratio 2 plt xlabel n 1 plt legend alpha 1 alpha 2 loc best shadow True 在公式周围加上美元符号 plt xlabel n 1
  • 使用 webdriver 与可爱的编辑器交互

    有谁知道我如何使用 webdriver 与可爱的编辑器交互 我想清除文字 下面的代码不起作用 driver switchTo frame 0 driver switchTo activeEle
  • 是否可以在用户不与网络交互的情况下播放音频?我该怎么做呢? [复制]

    这个问题在这里已经有答案了 我需要我的网页在用户不与页面交互的情况下播放音频剪辑 我知道用户体验很差 不应该这样做 但这就是我的客户所要求的 我也知道浏览器已经阻止了这个功能 所以如果有人能给我建议如何 破解 这个规则 例如事件 我将不胜感
  • 如何在 Sphinx 运行时预处理源文件?

    我已经为我的项目设置了 Sphinx 文档 并希望提取源文件的文档字符串并将它们嵌入到最终文档中 不幸的是 Sphinx 不支持源文件的语言 VHDL VHDL 似乎没有 Sphinx 域 所以我的想法如下 挂钩 Sphinx 运行并在 S
  • 如何在maatwebsite中获取excel数组

    我正在尝试使用最新版本将 Excel 文件转换为数组Laravel Excel https github com Maatwebsite Laravel Excel 3 1 9 下面的代码将下载该文件 return Excel downlo
  • 一个图例的两个独特标记符号

    我想在图例下的 红色实心圆圈 符号旁边添加一个 红色实心正方形 符号 我该如何实现这一目标 我更喜欢坚持使用 pyplot 而不是 pylab 下面是我一直在使用的代码 fig plt figure ax1 fig add axes 0 1
  • 条件逻辑在默认的knockout.js 2.0模板引擎下工作吗?

    下面的条件不适用于我的默认模板与 knockout js 2 0 它只是写出 IF 语句 span if data app viewModel admin home paging page span span else a href a i
  • CPU 总使用率 - 多核系统

    我正在使用 xen 并与xen top我得到了 CPU 总使用率的百分比 NAME STATE CPU sec CPU MEM k MEM MAXMEM k MAXMEM VCPUS NETS NETTX k NETRX k VBDS VB
  • 日期时间差异返回正确的月份甚至年份?

    是否有任何内置函数如何以比仅天数更好的方式获取 DateTime 对象之间的差异 我的意思是 1 个月零 23 天 我发现由于每个月的天数 闰年等不同 计算起来非常困难 谢谢 看一下野田时间 http noda time googlecod
  • “Typemock Isolator”如何模拟静态方法?

    正如你们中的一些人所知 通常不可能在 net 中模拟静态方法 通过模拟 我的意思是用具有相同签名的另一个方法替换类中的方法 通常用于测试目的 用于模拟方法的两种主要方法是将其声明为虚拟方法或在接口中定义它 net 静态方法不允许使用这两种方
  • Chrome“无法拖动”图标会干扰鼠标悬停事件,我该如何防止这种情况?

    下面是一些使用 JavaScript 创建一堆 div 元素来充当像素的代码 我为 mouseover 事件添加了一个事件侦听器 并检查鼠标是否被按下 如果按下鼠标 我会更改该像素的颜色 最终结果是一个简单的绘图函数 我相信使用 HTML5
  • Entity Framework Core:获取所有表的列表

    如何获取数据库上下文中 Entity Framework Core 中所有表的列表 以下答案适用于 Entity Framework 5 中的早期版本 我们目前使用的是 EF Core 3 如何获取 EF 5 中所有实体的列表 https
  • 在 Propel 1.5 中执行多个条件的连接

    这个问题是从问题而来的here https stackoverflow com questions 6877226 rewriting not in sub select as join for propel and here https