DataMapper ORM для отношений Codeigniter - PullRequest
4 голосов
/ 04 мая 2011

У меня есть таблица ...

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.

Ответы [ 3 ]

2 голосов
/ 11 мая 2011

То, что вы ищете, это самоотношения.

Если это отношение 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 голосов
/ 04 мая 2011

Вам не хватает пары ключевых моментов для использования DataMapper для 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.

В этом запросе вы получите все данные пользователя и сообщения для некоторого идентификатора сообщения.Теперь это полупростой случай, потому что я предполагаю, что сообщение может быть только от одного пользователя.

Для поля 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, и вам нужно изучить их синтаксис.

0 голосов
/ 24 февраля 2014
  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'
),
);
}

У меня есть только Proviede $ has_one и $ has_many, и вы должны включить остальные модели.


  1. Вы должны определить таблицы следующим образом:

Имя таблицы: поля пользователей: id, email, ....

Имя таблицы: сообщения [это важная таблица в данном случае]: идентификатор, идентификатор отправителя, идентификатор получателя, тема, сообщение, создано, ....


Теперь вам нужно заполнить базу данных примерами сообщений, и тогда вы можете проверить это так:

например, пользователь 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;
...