用于编码关系的DataMapper ORM



我有一个表…

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为Users Table中的主键id

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

您错过了使用CodeIgniter的DataMapper的几个关键点。首先,你需要做一些非常简单和重要的事情。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),
);

如果你想这样做,你也可以使用外键,但这取决于你的DB

现在您可以很容易地查询并获得消息发送给的所有用户。

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'
    )
);

}

  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. 你必须这样定义你的表:

表名:users字段:id, email, ....

Table Name: messages [this is important Table in this case]字段: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;

最新更新