Propel 1.5 Как сделать соединение с условием ИЛИ - PullRequest
1 голос
/ 28 сентября 2011

Мне нужно сгенерировать такой SQL, используя критерии сборки Propel:

"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 )"

Можно ли сделать соединение с или условие? Или, может быть, другие способы? Propel 1.5

Ответы [ 2 ]

2 голосов
/ 05 января 2012
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.Функциональность «использования» соединяет эти отношения.

0 голосов
/ 01 октября 2011

Первые два соединения (таблица2, таблица3) просты, если я правильно помню. Просто сделайте table1.OBJECT_ID ненужным в вашей схеме, и левое соединение будет использоваться автоматически.

Не сразу уверен насчет операции ИЛИ. Если вы застряли, один из способов сделать это - использовать вышеизложенное в необработанном запросе, а затем «гидрировать» объекты из набора результатов. Другой способ (очень хороший для сложных запросов, которые трудно выразить в ORM) - создать представление базы данных для вышеупомянутого, а затем добавить новую таблицу в вашу схему для представления. Конечно, это немного обманывает, но для некоторых действительно сложных вещей, которые я делал в большом проекте Symfony, это было здорово - и это также сделало отладку запросов очень простой.

...