我是Propel的新手并且一直在阅读文档.但是,我没有找到一个明确的等同于SQL的EXISTS和NOT EXISTS结构.例如,Linq in .NET有Any().在"惯用语"Propel中是否有以下等价物?
SELECT a.column1, a column2, a.etc
FROM TableA a
WHERE NOT EXISTS (SELECT 1
FROM TableB b
WHERE b.someIdColumn = a.someIdColumn
AND b.aNullableDateColumn IS NULL)
Run Code Online (Sandbox Code Playgroud)
在做了一些挖掘之后,我相信我对我的问题有了答案,或者至少是现有的答案.
EXISTS或NOT EXISTS之后出现的是子查询.虽然这个事实看起来很明显,但我最初并没有把注意力集中在子查询上.我在这个主题上找到了一些 资源.基本上,选项是使用JOIN重写查询(这是@Kaltas的答案的核心)或使用Criteria::CUSTOM
.我决定我可能更喜欢第二个选项,因为它允许我保留子查询,可能有助于我的数据库性能.
我做了很多阅读,然后,关于Criteria::CUSTOM
,但唯一真正帮助我的阅读是阅读Propel 1.5源.真的很简单.只需将子查询(使用数据库的表和列名,而不是 Propel的对象名)与EXISTS或NOT EXISTS一起放入where
调用中,如:
TableAQuery::create()
->where('NOT EXISTS (SELECT 1 FROM TableB WHERE TableA.someIdColumn = TableB.someIdColumn AND TableB.aNullableDateColumn IS NULL)')
->find();
Run Code Online (Sandbox Code Playgroud)
就这么简单.在内部,该where
方法经历了一些解释子句的可能性,并且没有找到匹配项,它将该子句视为存在Criteria::CUSTOM
并将其插入到SQL查询中.所以,我不能使用表别名,例如.
如果我有时间,也许我会采用更"ORM-ish"的方式来做这件事并提交补丁.不过,有人可能会打败我.
归档时间: |
|
查看次数: |
3437 次 |
最近记录: |