我有一张 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/