我需要使用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
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()
是必要的,因为你的信息似乎暗示Table4
与Table2
而不是Table1
有关,因此将Table4
直接加入Table1
将导致一系列致命的Propel错误。 “使用”功能桥接了这种关系。
如果我没记错的话,前两个连接(table2,table3)很容易。只需在模式中使table1.OBJECT_ID不需要,左边的连接将自动使用。
不能立即确定OR连接。如果遇到困难,一种方法是在原始查询中使用上述内容,然后从结果集中“水合”对象。另一种方法(非常适合在ORM中表达的复杂查询)是为上面的内容创建数据库视图,然后在模式中为视图添加新表。这肯定是有点作弊,但是对于一些非常复杂的大师详细信息,我在一个大型symfony项目中做了很多 - 它很棒 - 它使查询调试变得非常容易。