创建具有多个一对多关系的 DAO 查询?

Posted

技术标签:

【中文标题】创建具有多个一对多关系的 DAO 查询?【英文标题】:Creating a DAO Query with many One-to-Many Relationships? 【发布时间】:2011-01-08 20:14:37 【问题描述】:

我正在使用 phpmysql 开发一个 Web 应用程序。我有一个名为 User 的实体,其中有许多一对多的关系(与其他对象)(地址列表、电子邮件列表、电话号码列表等)。这些地址、电子邮件、电话号码通过数据库中的连接表(user_link_addresses、user_link_emails 等)提供给用户。

我现在正在尝试为用户实体创建一个高效的 DAO,特别是方法 readUserById($userId) 和 readAllUsers()。但是,由于我是 sql 和 DAO 模式的业余爱好者,因此无法正确创建此 DAO。

有人告诉我,将您的 DAO 保持在一个查询中,该查询一次读取所有信息,然后可以相应地映射到该实体,这对网络效率很重要。这确实是有道理的,但我无法生成 一个 查询,该查询包含所有内容的必要信息并且可以正确映射到我的实体。

现在,我可以通过在获取用户后在一个循环中执行多个查询来获取此信息......我只是不喜欢这个想法(而且我确信它不正确)。此外,我知道如何使用联结表进行连接 - 只是不使用如此复杂且需要正确映射的东西。

表格名称和字段

表:用户 字段:user_id、用户名、密码

表:地址 字段:address_id、街道、城市、州、邮政编码、类型

表格:电子邮件 字段:email_id、电子邮件、类型

表格:电话号码 字段:phone_number_id、area_code、phone_number、类型

-- 关联的连接表--

表:用户链接地址 字段:user_id、address_id

表:user_link_email 字段:user_id、email_id

表格:user_link_phone_number 字段:user_id、phone_number_id

无论如何,非常感谢所有帮助,

史蒂夫

【问题讨论】:

【参考方案1】:

有时在查询中包含关联是值得的,有时则不然。 Ruby on Rails 有一个非常简洁的插件,可以在应用程序运行时分析它,并告诉你哪些查询应该包含相关模型。

你可以试试这样的:

SELECT *
    FROM `user` 
    INNER JOIN `user_link_addresses`
        ON `user`.id = `user_link_addresses`.user_id
    INNER JOIN `user_link_foo`
        ON `user`.id = `user_link_foo`.user_id

如果你告诉我你所有的表名和字段,我可以帮你写一个更具体的查询。

【讨论】:

感谢您的回复!我在原始帖子中提供了表名和字段。我相信您编写的提供的代码只会获得地址 id 和 foo id 的关联,而不是每个的信息。 你确定吗,stjowa?看看这里给出的例子:en.wikipedia.org/wiki/Join_(SQL)#Inner_join——它从连接表中选择所有字段。 对不起,Eli,我之前不是很清楚...我的意思是查询不会给我所需的实际地址信息或 foo 信息。它会给我表中的所有信息,user_link_address 和 user_link_foo,但不是表中的信息,地址和 foo(user_link_address 和 user_link_foo 表只是连接表,不是存储“真实”信息的地方)。如果您注意到上面提供的表格和字段,它可能会解释得更多。

以上是关于创建具有多个一对多关系的 DAO 查询?的主要内容,如果未能解决你的问题,请参考以下文章

具有一对多关系的灵活查询

具有三层深度嵌套模型的查询集过滤器(多个一对多关系)

在一对多关系表中,仅从表A中获得在表B中具有多个对应行的那些行

如何使用 JDBI SQL 对象 API 创建一对多关系?

Doctrine 对一对多关系进行了许多查询

是否有一个 NSPredicate 来过滤具有一对多关系的模型(过滤多个)?