4

我有一张桌子...

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 获取每条消息时,如何获取用户详细信息。

4

3 回答 3

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,并且您需要学习它们的语法。

于 2011-05-04T15:11:13.363 回答
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

于 2011-05-11T15:18:33.060 回答
0
  1. 你必须让你的模型 [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'
),
);
}

我只提供了 $has_one 和 $has_many,你必须包括其余的模型。


  1. 你必须像这样定义你的表:

表名:用户字段:id、email、....

表名:messages [这是本例中的重要表] 字段: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;
于 2014-02-24T10:58:44.110 回答