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 <=>.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top