Propel 1.5如何使用OR条件进行连接

时间:2011-09-28 10:53:36

标签: join propel

我需要使用Propel构建标准生成这样的SQL:

"SELECT * 
FROM  `table1` 
LEFT JOIN table2 ON ( table1.OBJECT_ID = table2.ID ) 
LEFT JOIN table3 ON ( table1.OBJECT_ID = table3.ID ) 
LEFT JOIN table4 ON ( table4.USER_ID = table2.ID
OR table4.USER_ID = table3.AUTHOR_ID )"

是否可以加入或条件?或者其他一些方式? 推动1.5

2 个答案:

答案 0 :(得分:2)

Table1Query::create()
  ->leftJoinTable2()
  ->leftJoinTable3()
  ->useTable2Query()
    ->leftJoinTable4()
  ->endUse()
  ->condition('cond1', Table4::USER_ID . ' = ' . Table2::ID)
  ->condition('cond2', Table4::USER_ID . ' = ' . Table3::AUTHOR_ID)
  ->combine(array('cond1', 'cond2'), Criteria::LOGICAL_OR, 'onClause')
  ->setJoinCondition('Table4', 'onClause')
  ->find();

useTable2Query()是必要的,因为您的信息似乎暗示Table4Table2有关,而与Table1无关,因此Table4直接加入Table1 {1}}会导致一系列致命的Propel错误。 “使用”功能弥合了这种关系。

答案 1 :(得分:0)

如果我没记错的话,前两个连接(table2,table3)很简单。只需在模式中使table1.OBJECT_ID不需要,左连接将自动使用。

不能立即确定OR连接。如果遇到困难,一种方法是在原始查询中使用上述内容,然后从结果集中“水合”对象。另一种方法(非常适合在ORM中表达的复杂查询)是为上面的内容创建数据库视图,然后在模式中为视图添加新表。这肯定是有点作弊,但对于我在一个大型symfony项目中做的一些非常复杂的主要细节事情,它很棒 - 它使查询调试变得非常简单。