¿Cómo puedo seleccionar de una tabla derivada en Propel?
Pregunta
Estoy usando v1.3 del marco Propel PHP para una aplicación, y no puedo encontrar una manera de seleccionar de una tabla derivada utilizando el Criteria
objeto. Parte del SQL que quiero es:
SELECT unioned_table.foo, quux.stuff, baz.more_stuff...
FROM
quux
INNER JOIN
(SELECT foo, bar FROM table1
UNION
SELECT foo, bar FROM table2
) AS unioned_table
ON quux.field = unioned_table.foo
INNER JOIN baz
ON baz.blah = unioned_table.bar
INNER JOIN ...
WHERE conditions...
El SQL real es más complejo que esto, pero eso sólo incluye además se une.
He intentado utilizar Criteria::addAlias()
, aunque por desgracia que trata de SQL-escapar de la definición de la tabla. finalmente me di por vencido en tratar de escribir el SQL de esa manera, y creé una vista (llamada unisoned_table
en este ejemplo).
Me próxima intentado añadir une a esta tabla:
$c->addSelectColumn('unioned_table.foo');
$c->addSelectColumn(QuuxPeer::STUFF);
$c->addSelectColumn(BazPeer::MORE_STUFF);
// ...
$c->addJoin(QuuxPeer::FIELD, 'unioned_table.foo', Criteria::INNER_JOIN);
$c->addJoin(BazPeer::BLAH, 'unioned_table.bar', Criteria::INNER_JOIN);
// ...
$c->add(QuuxPeer::STUFF, $someval);
// ...
Lamentablemente esto se traduce en que se unió a la vista dos veces - una vez como una combinación interna con qux
, y una vez como una combinación cruzada con baz
. Curiosamente, si quito la columna de la doCount()
seleccionar y luego los unen cruz desaparece.
¿Alguien tiene alguna sugerencia en cuanto a cómo puedo hacer esto? No puedo utilizar SQL a medida solo desnudo, como puede ser necesario modificar este <=> (columnas reemplazados, añaden condiciones adicionales, etc.) o se utilizan en una llamada <=>.
Solución
Resulta que el orden es importante en Criteria::addJoin()
; el cambio de las uniones por lo que leen:
$c->addJoin(QuuxPeer::FIELD, 'unioned_table.foo', Criteria::INNER_JOIN);
$c->addJoin('unioned_table.bar', BazPeer::BLAH, Criteria::INNER_JOIN);
ha solucionado el problema.