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