2013-04-15 2 views
1

나는 프로펠러의 새로운 기능입니다. 많은 관계가 많은 테이블 모두를 모두 가져 오는 데는 문제가 있습니다.many to many relation 프로펠러

사용자 및 그룹 테이블이 있습니다. 및 조인 테이블 user_group.

사용자 및 그룹이 많은 관계로 많은이

i와 단일 쿼리의 모든 관련 데이터를 찾기 위해 추적 방법을 사용.

의 schema.xml 파일

<table name="user" phpName="User" idMethod="native"> 
    <column name="id" type="INTEGER" primaryKey="true" autoIncrement="true" required="true" /> 
    <column name="name" type="VARCHAR" size="100" required="true" /> 
    <column name="email" type="VARCHAR" size="100" required="true" /> 
    <column name="age" type="INTEGER" required="true" /> 
    <column name="gender" type="VARCHAR" size="50" required="true" /> 
    <column name="company" type="VARCHAR" size="100" required="true" /> 
    <column name="address" type="VARCHAR" size="100" required="true" /> 
    <column name="country" type="VARCHAR" size="100" required="true" /> 
    <column name="mobileno" type="DOUBLE" required="true" /> 
    <column name="comment_about" type="VARCHAR" size="200" required="true" /> 
    <foreign-key foreignTable="post" name="post" phpName="postWriter"> 
     <reference local="id" foreign="user_id" /> 
    </foreign-key> 
</table> 

<table name="group"> 
    <column name="id" type="INTEGER" primaryKey="true" autoIncrement="true" /> 
    <column name="name" type="VARCHAR" size="32" /> 
</table> 


<table name="user_group" isCrossRef="true"> 
    <column name="user_id" type="INTEGER" primaryKey="true" /> 
    <column name="group_id" type="INTEGER" primaryKey="true" /> 
    <foreign-key foreignTable="user"> 
     <reference local="user_id" foreign="id" /> 
    </foreign-key> 
    <foreign-key foreignTable="group"> 
     <reference local="group_id" foreign="id" /> 
    </foreign-key> 
</table> 

하고 그리고 난이

$userObj = UserQuery::create() 
     ->join('Group') 
     ->find(); 

같은 관련 데이터를 찾을 쿼리 위에 나에게 치명적인 오류

Fatal error: Uncaught exception 'PropelException' with message 'Unable to execute SELECT statement [SELECT user.id, user.name, user.email, user.age, user.gender, user.company, user.address, user.country, user.mobileno, user.comment_about FROM `user` INNER JOIN `` ON() 

을 제공하려고 저를 도와주세요 호 우리는 이것을 해결할 수 있습니다.

+0

어쨌든이 쿼리로 무엇을 달성하려고합니까? – 1337holiday

+0

cakephp와 같이 하나의 Query로 관련 그룹 사용자를 가져오고 싶습니다. 이것을 사용하고 있습니다. $ groupobj = GroupQuery :: create() -> find(); foreach ($ groupobj $ group) { var_dump ($ group-> getUsers() -> toArray()); } 위의 쿼리는 foreach 루프에서 쿼리 사용자를 선택합니다. 데이터베이스 크기와 관련된 좋은 방법이 아닌 것 같아 사용자가있는 모든 그룹을 찾을 수 있습니다. –

답변

3

MySQL은 그런 일이 없기 때문에 직접 대다 관계에 참가할 수 없습니다.

$relatedGroups = $userObject->getGroups(); 

당신이 User가없는 경우 : 당신은 당신이 이미 User 객체가있는 경우

는, 당신은 단순히 관련 그룹이 방법을 "얻을"수 있습니다 ... 두 가지 중 하나를 수행 할 수 있습니다 아직 객체, 당신은 모든 레코드 (사용자 및 그룹), 나는 당신이 할 수 있다고 생각을 채우려 :

당신이 할 수있는 코드에서 이제
$users = UserQuery::create() 
      ->join('User.UserGroup') 
      ->join('UserGroup.Group') 
      ->with('Group') // this line hydrates Group objects as well as Users 
      ->find(); 

User의를 통해 루프를 추가하지 않고 각각의 Group의를 얻을 수 DB 히트 :

foreach ($users as $user) { 
    $user->getGroups(); 
    // normally this would be an extra DB hit, but because we used "->with('Group')" 
    // above in the query, the objects are already hydrated. 
} 

희망이 있습니다. info on minimizing queries은 Propel 사이트에서 "with()"를 사용하며 info on many-to-many relationships (쿼리 예제 포함)입니다.

+0

Thanks @ jakerella. 고마워. –

+0

물론, 도움이되기를 바랍니다. – jakerella