4

私はテーブルを持っています...

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 ;

idToおよびFromは、ユーザーテーブルの主キーです。

CodeIgniter DataMapperで各メッセージを取得するときに、ユーザーの詳細を取得するにはどうすればよいですか。

4

3 に答える 3

2

CodeIgniter に DataMapper を使用するための重要なポイントがいくつかありません。まず、かなり単純で重要なことをいくつか行う必要があります。DataMapper (DM) は、正規化された db 命名を使用して関係を見つけます。これが意味することは、データベースにクエリを実行する場合です。DM を 2 つの列に使用するのは少し難しくなりましたが、本当に必要ないと思います。

最初に DM を使用しない場合、実際には 2 つのクエリだけが必要です

SELECT u.*, m.* FROM messages AS m, users AS u WHERE m.from = u.id AND m.id = SOME_ID.

このクエリは、メッセージ ID のすべてのユーザーの詳細とメッセージの詳細を取得します。メッセージは1人のユーザーからしか送信できないと想定しているため、これはやや単純なケースです。

一方、to フィールドについては、リレーショナル テーブルを使用する必要があると仮定します。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 を使用するには多くの余分な作業が必要であり、それらの構文を学ぶ必要があります。

于 2011-05-04T15:11:13.363 に答える
2

あなたが探しているのは自己関係です。

これが「has_one」リレーションの場合、テーブル内の外部キーでそれを行うことができます。キーの命名規則に従う必要があります (to と from の代わりに to_id と from_id)。

現在 (v1.8.0)、任意の 2 つのモデル間で 1 つのリレーションのみを持つことができます。

$has_one = array(
    'to' => array(
        'class' => 'messages',
        'other_field' => 'messages'
    ),
    'messages' => array(
        'other_field' => 'to'
    )
);

}

詳細については、 http://datamapper.wanwizard.eu/pages/advancedrelations.htmlを参照してください。

于 2011-05-11T15:18:33.060 に答える
0
  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. 次のようにテーブルを定義する必要があります。

テーブル名: ユーザー フィールド: id、メール、....

テーブル名: メッセージ [この場合、これは重要なテーブルです] フィールド: 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;
于 2014-02-24T10:58:44.110 に答える