2011-05-04 81 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;