用于Codeigniter关系的DataMapper ORM

时间:2011-05-04 03:55:26

标签: 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  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

To and From是来自Users Table的主键id

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

3 个答案:

答案 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)

  
      
  1. 你必须制作你的模型[models / users.php]和   [models / messages.php]是这样的:
  2.   

    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,你必须包括其余模型。


  
      
  1. 你必须像这样对你的桌子进行解决:
  2.         

    表名:用户字段: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;