2009-11-26 2 views
1

저는 현재 CakePHP에 대해 망설이고 있습니다. 앞으로의 웹 응용 프로그램에서 사용할 것인지 결정할 것입니다.CakePHP에서 가장 간결하고 완전한 재귀 적 제휴 지원은 무엇입니까?

문제는 필자가 어느 시점에서 관련 데이터를 서로 공유한다는 것입니다. 내가 직접 모든 코드를 작성한다면 오히려 많은 조인과 서브 쿼리를 사용하는 SQL 쿼리를 사용할 것입니다. 하지만 CakePHP가 두 테이블 사이의 조인만을 지원한다는 것을 이해합니다.

예를 들어 사용자, 프로필, 순위, 평점 테이블이 있으며 특정 사용자의 프로필, 순위 및 평점을 얻고 싶습니다. CakePHP는 여러 개의 분리 된 SELECT 문을 사용하여 트릭을 수행합니다. 그러나 이것은 다중 조인이있는 하나의 쿼리를 사용하여 가능합니다. 성능은 매우 중요하므로 SQL 쿼리로 너무 낭비하지 않는 것이 주요한 장점입니다.

두 건의 해킹 (one behaviourone using bindModel)과 a similar StackOverflow thread을 발견했습니다.

나는 행동이나 bindModel 해킹을 사용할지 여부를 결정하지 않았습니다. 누구나 최선의 접근 방식이 무엇인지 밝힐 수 있습니까? 전체 CakePHP 구조에서 가장 잘 통합되는 것은 무엇입니까 (페이지 매김과 같은 기능이 여전히 사용 가능합니까)? 아니면 궁극적으로 더 나은 또 다른 접근 방식이 있습니다. SO 스레드는 containables를 사용하는 메소드를 언급합니다.

호프 (Hope) 저는이 문제에 대해 별도의 질문을하지 않겠지 만, 오래된 스레드는 몇 가지 해결책을 열거하지만, 대답은 전술 한 이유로 저에게 명확하지 않습니다.

답변

1

이 작업을 수행하는 가장 쉬운 방법은 sql 쿼리를 줄이고 캐싱 (caching)을 구현하는 것입니다.

다음 해결책은 쿼리를 줄이기 위해 작동하지 않으므로 Containable 동작을 건너 뛰는 것은 찾기 호출에서 일부 임시 조인을 직접 수행하는 것입니다. 이를 중앙 위치에서 호출 할 수 있도록 모델에 밀어 넣는 것이 좋습니다.http://blog.rafaelbandeira3.com/2008/11/16/linkable-behavior-taking-it-easy-in-your-db/이 필드를 정의하는 옵션 배열에서 사용자 지정 키를 사용할 수 있습니다 : http://bakery.cakephp.org/articles/view/quick-tip-doing-ad-hoc-joins-in-model-find 내가 지금까지 찾아낸 최고의 솔루션은 라파엘 Bandeira의 연결 가능한 동작입니다

:이 기술에 대한 좋은 기사는 여기 빵집에 및 관계를 명확하게 결합하고 1에 설명 된 기술을 사용하여 순차 쿼리 대신 조인을 사용합니다.

프로젝트에 대한 행운을 빕니다.

+0

포인터를 보내 주셔서 감사합니다. 지금까지 큰 도움이되었습니다. – mensch

0

필자는 비슷한 문제가 있었고 성능이 큰 요소 였기 때문에 단순히 "cake-ness"를 유지하기위한 솔루션으로 시도하고 피델리를 사용하는 대신 원시 SQL을 사용하기로 결정했습니다. 가끔 병목 현상이 어디에 있는지 알면 좋을 것입니다 (2의 디버그 모드가 다소 도움이 되더라도). db를 마이그레이션하는 것이 결코 문제가되지 않습니다.

필자는 자동 페이지 매김, 정렬 등의 편의성을 위해 성능을 향상하기로 결정했습니다. 실제로 이러한 코드를 작성할 수 있습니다. 이전에는 그렇게했습니다.

그러나 bindModel 솔루션은 나에게 흥미가 있습니다. 이것은 내가 다음 번에이 문제를 가로 질러 갈 것이라는 것입니다.

1

언급 한 다른 StackOverflow 기사의 this bakery article에 대한 링크는 (bindModel 또는 사용자 지정 동작없이) 임시 연결을 수행하는 더 좋은 방법 일 수 있습니다. find() 메소드 호출에 대한 옵션에서 조인을 인라인으로 조인 (조인 유형과 같은 추가 가제트 포함)을 지정할 수 있지만 find에 쓰기가 거의 필요없는 새로운 "유형"을 생성하면 크게 단순화 될 수 있습니다) 옵션. 그게 기사에서 설명하는 것입니다.

나는 또한 일부 쿼리에 원시 SQL을 사용했지만 CakePHP가 지원하는 데이터베이스와 예상치 못한 비 호환성을 초래할 수 있음을 발견했습니다. 그러나 대중이 사용할 웹 응용 프로그램을 작성하지 않으면이 점이별로 중요하지 않습니다.