문제

응용 프로그램에 Propel PHP 프레임 워크의 v1.3을 사용하고 있으며, Criteria 물체. 내가 원하는 SQL의 일부는 다음과 같습니다.

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

실제 SQL은 이것보다 더 복잡하지만 추가 조인이 포함됩니다.

나는 사용하려고 노력했다 Criteria::addAlias(), 불행히도 그것은 테이블 정의를 SQL-escape를 시도합니다. 나는 결국 그런 식으로 SQL을 쓰려고 노력했고보기를 만들었습니다 ( unisoned_table 이 예에서).

다음 으로이 테이블에 조인을 추가하려고했습니다.

$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);
// ...

슬프게도 이것은보기가 결합된다 두 배 - 한 번 내부 가입 qux, 그리고 한 번은 크로스 가입으로 baz. 기괴하게, 내가 제거하면 baz 열을 선택한 다음 크로스 조인이 사라집니다.

내가 어떻게 할 수 있는지에 대한 제안이 있습니까? 이렇게는 Bare Custom SQL 만 사용할 수 없습니다. Criteria 수정 (열 교체, 추가 조건 등)을 수정하거나 doCount() 전화.

도움이 되었습니까?

해결책

주문이 중요하다는 것이 밝혀졌습니다 Criteria::addJoin(); 조인을 변경하여 읽습니다.

$c->addJoin(QuuxPeer::FIELD, 'unioned_table.foo', Criteria::INNER_JOIN);
$c->addJoin('unioned_table.bar', BazPeer::BLAH, Criteria::INNER_JOIN);

문제를 수정했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top