2011-05-04 94 views
4

我有一个表...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 ; 

收件人和发件人是从用户表的主键id

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

回答

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。 现在这是半简单的情况,因为我假设一条消息只能来自一个用户。

对于字段另一方面,我会假设你应该使用关系表。要使用DM为它,你必须命名表如users_messages,但为什么你需要使用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), 
); 

如果你想这样做的权利,你也将使用外键,但是这取决于你的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,你需要学习他们的语法。

+0

我一直在使用DM,而现在我刚开始觉得它的方式不仅仅是帮助。有时候它很棒,但是有很多次它确实需要更多的代码,更多的文件和更多的查询,并且支持不一定是最优的命名约定。可能是因为我没有以最佳方式使用它。 – 2011-05-04 15:22:24

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

0
  1. 你必须让你的模型[模型/ users.php]和 [型号/ 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,你必须包含其余的模型。


  1. 你必须deifne你的表是这样的:

表名:用户字段:ID,电子邮件,....

表名:信息[这是这种情况下的重要表]字段: id,sender_id,receiver_id,主题,消息,创建,...。


现在必须填写与例如邮件数据库,然后你可以测试这样的:

例如用户X已登录,现在的对象。你得到用户的最后10条信息是这样的:

$messages = new Message(); 
$messages->where_related_user('id', $user->id); 
$messages->limit(10); 
$messages->get(); 

你可以得到每个消息的reciever和发件人是这样的:

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