我有一张桌子......
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 and From是来自Users Table的主键id
。
当我使用CodeIgniter DataMapper获取每条消息时,如何获取用户详细信息。
答案 0 :(得分:2)
您缺少使用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,你需要学习它们的语法。
答案 1 :(得分:2)
您正在寻找的是一种自我关系。
如果这是'has_one'关系,您可以使用表内外键执行此操作。您必须遵循键的命名约定(to_id和from_id而不是to和from)。
目前(v1.8.0),任何两个模型之间只能有一个关系:
$has_one = array(
'to' => array(
'class' => 'messages',
'other_field' => 'messages'
),
'messages' => array(
'other_field' => 'to'
)
);
}
有关详细信息,请参阅http://datamapper.wanwizard.eu/pages/advancedrelations.html。
答案 2 :(得分:0)
- 你必须制作你的模型[models / users.php]和 [models / messages.php]是这样的:
醇>
class User extends DataMapper {
var $has_many = array(
'sent_message' => array(
'class' => 'Message',
'other_field' => 'sender',
),
'received_message' => array(
'class' => 'Message',
'other_field' => 'receiver',
),
);
}
class Message extends Datamapper {
var $has_one = array(
'sender' => array(
'class' => 'User',
'other_field' => 'sent_message',
),
'receiver' => array(
'class' => 'User',
'other_field' => 'received_message'
),
);
}
我只有proviede $ has_one和$ has_many,你必须包括其余模型。
- 你必须像这样对你的桌子进行解决:
醇>表名:用户字段:id,email,....
表名:消息[这是本例中的重要表]字段: id,sender_id,receiver_id,subject,message,created,....
现在必须用示例消息填充您的数据库,然后您可以像这样测试:
例如,用户X已登录,现在是一个对象。您可以获得用户最近10条消息:
$messages = new Message();
$messages->where_related_user('id', $user->id);
$messages->limit(10);
$messages->get();
你可以得到每封邮件的收件人和发件人:
$messages = new Message();
$messages->include_related('sender');
$messages->include_related('receiver');
$messages->get();
现在打印每个发件人和收件人的姓名:
foreach($messages as $message):
echo $message->sender->name;
echo $message->receiver->name;
endforeach;