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

问题描述 投票:1回答:2

我需要使用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

join propel
2个回答
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将导致一系列致命的Propel错误。 “使用”功能桥接了这种关系。


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.