我有一张 table ...

CREATE TABLE IF NOT EXISTS `messages` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `to` int(11) NOT NULL,
  `from` int(11) NOT NULL,
  `subject` varchar(50) NOT NULL,
  `message` varchar(1000) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

To 和 From 是用户表中的主键 id

当我使用 CodeIgniter DataMapper 获取每条消息时,如何获取用户详细信息。

最佳答案

您缺少使用 DataMapper for CodeIgniter 的几个关键点。首先,你需要做一些非常简单和重要的事情。 DataMapper (DM) 使用规范化的数据库命名来查找关系。这意味着如果您查询您的数据库。现在对两列使用 DM 有点困难,我认为你真的不需要它。

首先,如果你不使用 DM 你真的只需要两个查询

SELECT u.*, m.* FROM messages AS m, users AS u WHERE m.from = u.id AND m.id = SOME_ID.

此查询将为您获取某些消息 ID 的所有用户详细信息和消息详细信息。
现在这是半简单的情况,因为我假设消息只能来自一个用户。

另一方面,对于 to 字段,我假设您应该使用关系表。要为它使用 DM,您必须将表命名为 users_messages 之类的名称,但同样,当 DM 确实有点矫枉过正时,为什么还需要使用它。

现在对于 from 字段,你有一个多对多的关系,因为一条消息可以有很多用户,而一个用户可以有很多他们发送的消息。

所以创建一个这样的表
CREATE TABLE message_to (
    user_id BIGINT UNSIGNED NOT NULL,
    message_to_id BIGING UNSIGNED NOT NULL,
    PRIMARY KEY (user_id, message_to_id),
);

如果你想做得对,你也将使用外键,但这取决于你的数据库

现在,您可以非常轻松地查询并获取消息发送到的所有用户。
SELECT u.*, m.* FROM users AS u, m AS messages JOIN messages_to AS m_t ON (u.id = m_t.user_id)

反过来查询也同样简单,获取用户发送的所有消息。

请记住,仅仅因为存在像 DM 这样的工具并不意味着它是最适合这项工作的工具,并且在这种情况下实际使用 DM 在没有必要时会产生相当可观的开销。

使用 DM 执行此操作需要相同的事情,您只是无法按照您认为合适的方式命名您的表/列,并且您需要为每个表创建一个类来创建它与其他表的关系。

这意味着你有很多额外的工作来使用 DM,你需要学习它们的语法。

关于php - 用于 Codeigniter 关系的 DataMapper ORM,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5878336/

10-14 15:18