推测相当于"存在"

And*_*rew 3 php sql propel

我是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)

And*_*rew 5

在做了一些挖掘之后,我相信我对我的问题有了答案,或者至少是现有的答案.

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"的方式来做这件事并提交补丁.不过,有人可能会打败我.