我是propel的新手。我面临着从两个表中提取所有记录的问题,这两个表具有多对多关系。
我有一个用户和组表。和连接表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 () 请帮帮我,我们怎样才能解决这个问题。
发布于 2013-04-15 22:58:54
您不能直接加入多对多关系,因为在MySQL中没有这样的东西。你可以做两件事中的一件。
如果你已经有了一个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();现在,在您的代码中,您可以遍历Users并获得每个Groups,而无需额外的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.
}希望这能有所帮助。在Propel站点上有使用"with()“的info on minimizing queries,还有info on many-to-many relationships (带有查询示例)。
https://stackoverflow.com/questions/16007982
复制相似问题