【问题标题】:find query for many to many relation propel查找多对多关系推进的查询
【发布时间】:2013-04-07 03:25:16
【问题描述】:

我是新来的推进器。 我面临一个问题,要从具有多对多关系的两个表中获取所有记录。

我有一个用户和组表。和一个连接表 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 ()  

请帮助我,我们可以解决这个问题。

【问题讨论】:

  • 你想用那个查询来完成什么?
  • 我想在一个查询中获取具有相关组的用户,就像在 cakephp 中一样。我正在使用这个 $groupobj = GroupQuery::create() ->find(); foreach($groupobj as $group){ var_dump($group->getUsers()->toArray());上面的查询将在 foreach 循环中选择查询用户我认为这不是一个与数据库大小相关的好方法来查找所有用户组

标签: php orm schema relationship propel


【解决方案1】:

您不能直接加入多对多关系,因为 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(带有查询示例)。

【讨论】:

  • 谢谢@jakerella。非常感谢。
  • 当然可以,希望对您有所帮助。
猜你喜欢
  • 2021-01-30
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 2018-11-02
  • 2015-10-26
  • 2011-08-08
  • 2015-05-29
相关资源
最近更新 更多