我是Propel的新手,已经在阅读文档。但是,我还没有找到与SQL中的EXISTS和NOT EXISTS构造完全相同的构造。例如,.NET中的Linq具有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)
Criteria::CUSTOM
。我决定我可能更喜欢第二种选择,因为它允许我保留子查询,从而可能提高数据库性能。然后,我做了很多关于Criteria::CUSTOM
的阅读,但是真正帮助我的唯一阅读是阅读Propel 1.5来源。真的,这非常简单。只需将子查询,逐字记录(使用数据库的表和列名,
not 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();
就这么简单。在内部,where
方法通过几种可能性来解释该子句,并且找不到匹配项,它将该子句视为Criteria::CUSTOM
的子句,并将其按原样插入SQL查询中。因此,例如,我不能使用表别名。
[如果有时间,也许我会采用一种更“ ORM式”的方法来完成此工作并提交补丁。不过,可能有人会击败我。
SELECT
a.column1,
a.column2,
a.etc
FROM
TableA a
WHERE
(SELECT
COUNT(*)
FROM
TableB b
WHERE
b.someIdColumn = a.someIdColumn
AND
b.aNullableDateColumn IS NULL
) > 0
在Propel中很容易做到。
甚至在Propel中更干净,更容易实现:
SELECT a.column1, a.column2, a.etc FROM TableA a LEFT JOIN TableB b ON (b.someIdColumn = a.someIdColumn) WHERE b.aNullableDateColumn IS NULL AND b.primaryKeyColumn IS NOT NULL
$users = UserQuery::create()->filterById(UserPerUserGroupQuery::create()->select('user_id')->find(), CRITERIA::NOT_IN)
->orderByUserName()
->find();