1

私は推進するのが初めてです。多対多の関係を持つ両方のテーブルからすべてのレコードを取得するという問題に直面しています。

ユーザーとグループのテーブルがあります。および結合テーブル user_group。

ユーザーとグループには多対多の関係があります

i と follow メソッドを使用して、単一のクエリですべての関連データを検索します。

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 ()  

これを解決できるように助けてください。

4

1 に答える 1

3

MySQL にはそのようなものがないため、多対多の関係を直接結合することはできません。あなたは2つのことのうちの1つを行うことができます...

オブジェクトが既にある場合は、User次の方法で関連するグループを簡単に「取得」できます。

$relatedGroups = $userObject->getGroups();

まだオブジェクトがなく、Userすべてのレコード (ユーザーとグループ) を入力したい場合は、次のようにできると思います。

$users = UserQuery::create()
           ->join('User.UserGroup')
           ->join('UserGroup.Group')
           ->with('Group')  // this line hydrates Group objects as well as Users
           ->find();

これで、コード内で s をループして、追加の DB ヒットなしでUserそれぞれの s を取得できます。Group

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

お役に立てれば。Propel サイトには、"with()" を使用してクエリを最小化するための情報と、多対多の関係に関する情報(クエリの例を含む) があります。

于 2013-04-15T14:58:54.047 に答える