2012-10-03 4 views
3

삽입 트리거 업데이트 및 쿼리 작업 후 삽입 시퀀스가 ​​있고 내 문제는 쿼리에서받은 데이터가 트리거에 의해 수행 된 업데이트를 반영하지 않는다는 것입니다 (데이터베이스의 데이터가 실제로 업데이트 되더라도).데이터베이스 트리거가 열을 업데이트 한 후 쿼리를 만드는 방법은 무엇입니까?

PHP, PostgreSQL 및 Propel 1.6 ORM을 사용하고 있습니다 (데이터베이스 및 ORM에 관계 없음).

  1. 를 사용하여 AJAX가 ('book_id', 'book_score', 'voter_id'열 사용) "book_vote"테이블에 새 행 (투표)를 삽입하기 :

    나는 다음과 같은 순서를 .

  2. "book"테이블의 해당 "book_count"및 "average_score"열을 업데이트하려면 insert 트리거 후 PostgreSQL을 가져야합니다.

  3. "book"에 대한 새로운 "vote_count"및 "average_score"데이터를 얻고 AJAX를 사용하여 해당 데이터를 클라이언트에 다시 보냅니다 (투표 후 업데이트 된 값 표시).

이것은 모두 동일한 PHP 세션에서 발생하며 내 문제는 AJAX 응답에 업데이트 된 "책"값을 얻지 못한다는 것입니다. 데이터베이스 트리거가 수행되기 전에 쿼리가 수행 된 것 같습니다. 데이터베이스 트리거 후에 쿼리가 수행되도록하는 방법이 있습니까?

+0

삽입 후에 트리거가 작동합니까? 삽입 후 책 테이블의 열을 업데이트 했습니까? – piotrekkr

+0

@piotrekkr : 예! 방아쇠가 작동합니다. "book"테이블의 해당 행에 대한 "vote_count"및 "average_score"열이 트리거로 업데이트됩니다. 그러나 쿼리가 업데이트되기 전에 데이터를 가져옵니다 ... – RayOnAir

+0

트랜잭션에서 삽입 (및 트리거)을 래핑하고 다음에 처리하기 전에 커밋합니다. – JvdBerg

답변

1

Propel 개체에서 저장 작업을 수행하고 있고 그 행을 추가로 수정하는 외부 트리거가있는 것 같습니다. Propel에게 삽입/업데이트 직후 객체를 새로 고침해야한다고 말할 수 있어야합니다 ... 고맙게도 Propel이 직접 지원합니다. (귀하의 경우에 당신은 단지 삽입을 원하는 아마 것) 요구 사항에 따라

<table name="book_vote" reloadOnInsert="true" reloadOnUpdate="true"> 

당신은 다시로드 문 중 하나 또는 둘 모두를 사용할 수 있습니다 : 스키마에 테이블 요소에서이 작업을 수행. 거기에서 모델을 다시 작성하면 잘 작동합니다. 세부 정보 here.

부록 : 토론 할 때 이미 다시로드하려는 외부 행을로드 했으므로 해당 인스턴스가 데이터베이스가 아닌 인스턴스 풀에서 검색되는 것으로 나타납니다. 당신은 BookPeer::clearInstancePool()가 당신을 위해 그것을 해결했다는 것을 알았습니다 - 대단해요! 보너스 포인트의 경우 개별적으로 풀에서 항목을 제거 할 수 있는지 확인하십시오. 전체 테이블에 대한 풀을 지우는 대신 풀이 정상적으로 실행되고 항목을 한 번에 하나씩 제거하는 것이 더 효율적일 수 있습니다. 가능한 경우 알려주십시오!

+0

고마워요! 내가 언급 한 테이블 속성에 대해 알지 못했습니다. 그러나, 내가 "book"테이블 (트리거에 의해 업데이트되는 집계 열을 가짐)과 "book_vote"테이블 (투표가 실제로 삽입되거나 업데이트되는 곳)이있는 제 경우에는 효과가 있습니까? 그렇다면 두 테이블 중 어느 속성에 속성을 포함해야합니까? 나는 그 시간에 몇 가지 테스트를 할 것입니다. – RayOnAir

+1

질문을 다시 읽으십시오. 왜 올바른 총계를 얻지 못했을 지 생각하고 있습니다. 고려할 수있는 또 다른 사항은 특정 총 행을 이미로드했으며 해당 객체가 인스턴스 풀에 캐시되어 있다는 것입니다. 'Propel :: disableInstancePooling()'을 실행 한 다음 총 행을로드하십시오. – halfer

+0

(위와는 별도로 질문에 몇 가지 코드를 포함하면 더 명확하게 알 수 있습니다.) – halfer

0

업데이트 후 데이터를 다시 가져 오는 방법은 ORM 설명서를 참조하십시오. 열 옵션을 사용하거나 메소드를 호출해야 할 수 있습니다.

열 및 삽입에 대한 기본값이있는 경우 동일한 문제가 발생합니다.

+0

이 답변이 아니라 답변 가이드 라인입니다. 적어도 몇 가지 링크를 제공 할 수 있습니다. – rantanplan

관련 문제