2012-07-05 5 views
0

(필자는 CFWheels Google 그룹 (2 회)에이를 게시,하지만 내 메시지는 결코 나타나지 않는 몇 가지 이유. 검토 그리스트가 시도?)는 hasMany의()

을 포함하여 findall은()에서 기록에 합류 여기에 내 문제가있다. 나는 Wheels에 CF의 소셜 네트워킹 앱을 개발하고 있는데, Chris Peters의 멋진 튜토리얼에서 익숙한 것과는 너무 다르지 않다. 광산에서는 사용자 디렉토리에 최신 상태 메시지를 표시해야합니다. hasMany ("상태")가있는 사용자 모델과 belongsTo ("user")가있는 상태 모델이 있습니다. 그래서 여기에 내가 시작한 코드가 있습니다 :

users = model("user").findAll(include="userprofile, statuses"); 

물론이 코드는 상태 테이블의 모든 상태 메시지에 대해 하나의 레코드를 반환합니다. 엄청난 과잉. 그래서 다음에 내가 시도 :

users = model("user").findAll(include="userprofile, statuses", group="users.id"); 

가까이 얻기하지만 가장 최근의 상태를 선택하고자 할 때 지금 우리는 각 사용자에 대한 최초의 상태 레코드 (가장 낮은 status.id)를 받고있어. 직선적 인 SQL에서 하위 쿼리를 사용하여 먼저 상태를 재정렬한다고 생각하지만 바퀴 ORM에서는 사용할 수 없습니다. 그래서 이것을 달성 할 수있는 또 다른 깨끗한 방법이 있습니까? 아니면 거대한 쿼리 결과를 드래그하거나 상태를 내 CFML에 객체화 한 다음 루프하는 동안 필터링해야합니까?

// models/User.cfc 
function init() { 
    property(
     name="mostRecentStatusMessage", 
     sql="SELECT message FROM statuses WHERE userid = users.id ORDER BY createdat DESC LIMIT 1,1" 
    ); 
} 

물론, SELECT 문의 구문이 RDBMS에 따라 달라집니다,하지만 당신이 시작할 수 있어야합니다

답변

1

당신은 calculated property 사용하여 가장 최근의 상태를 잡을 수 있습니다.

단점은 쿼리에서 사용할 수있는 각 열에 대해 계산 된 속성을 만들어야한다는 것입니다.

다른 옵션은 모델에 메서드를 만들고 <cfquery> 태그에 사용자 지정 SQL을 작성하는 것입니다. 그런 식으로도 완벽하게 유효합니다.

+0

안녕하세요. 답장을 보내 주셔서 감사 드리며 (일반적으로 CFW를 나머지 사람들이 이용할 수있게 해줍니다!) property() 솔루션은 좋은 시작이었습니다. (저를 쳐다 보았습니다.) 서면으로 말하면, 이제까지 가장 최근의 상태를 얻었습니다. 적용 가능한 경우 각 사용자에 대해 가장 최근 상태가 필요합니다 (일부는 상태가 전혀 없음). –

+0

죄송합니다. 하위 편집에'WHERE' 절을 추가하는 곳에서 편집이 작동합니까? –

+0

글쎄, 나는 나의 마지막 반응 이전에 그것을 시도했지만, 모든 것은 첫 번째 기록에 대한 메시지를 얻는다. 4 명의 테스트 사용자가 사용자 및 사용자 프로필에 레코드가 있습니다. 그들 중 두 명은 최소한 하나의 상태를 게시했습니다. 다른 두 사람은 아무것도 없다. user.id = 1에 대한 상태 만 표시되므로 첫 번째 항목을 확인한 것 같습니다. 그 후 다른 모든 3 명의 사용자 상태에 대해 값을 반환합니다. –

0

나는 당신의 정확한 DB 스키마를 잘 모르겠지만, 귀하의 findall은()는 이와 같은 뭔가 더 같이 안 : 특정 사용자의 모든 상태를 얻어야한다

statuses = model("status").findAll(include="userprofile(user)", where="userid = users.id"); 

... 또는 모든 사용자에게 필요합니까? 나는 너의 질문을 운동하기 조금 까다 롭다. 네가 정확히 무엇을 돌려 주려고하는거야?