Php Codeigniter关系的数据映射器ORM

Php Codeigniter关系的数据映射器ORM,php,mysql,codeigniter,codeigniter-datamapper,Php,Mysql,Codeigniter,Codeigniter Datamapper,我有一张桌子 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 DEF

我有一张桌子

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

您缺少使用CodeIgniter DataMapper的几个关键点。首先,你需要做一些非常简单和重要的事情。DataMapper(DM)使用规范化的db命名来查找关系。这意味着如果查询数据库。现在在两个列中使用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\u messages
的名称,但同样,当DM真的太过分时,您为什么需要使用DM呢

现在,对于“发件人”字段,您有一个多对多关系,因为一条消息可以有许多它要发送的用户,而一个用户可以有许多他们发送的消息

所以创建一个这样的表

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

你想要的是一种自我关系

如果这是一个“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'
    )
);
}

有关更多信息,请参阅

  • 您必须创建模型[models/users.php]和 [models/messages.php]如下所示:


  • 我只提供了$has\u one和$has\u many,您必须包括其他型号


  • 您必须像这样定义您的表格:
  • 表名称:用户字段:id、电子邮件等

    表名称:messages[这是本例中的重要表]字段: id、发送者id、接收者id、主题、消息、已创建等


    现在,您必须用示例消息填充数据库,然后可以进行如下测试:

        $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();
    
    例如,用户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();
    
    您可以按如下方式获取每条邮件的收件人和发件人:

        $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;
    

    我已经使用DM有一段时间了,我现在才开始感觉到它的作用远大于它的作用。有时它很好,但有时它实际上需要更多的代码、更多的文件和更多的查询,并且支持不一定是最佳的命名约定。可能是我没有以最佳方式使用它。