Проблема отношений в Cakephp. Как получить данные? - PullRequest
0 голосов
/ 22 февраля 2010

Я пытаюсь сделать функциональность сообщений похожей на Facebook. Просто вещь сообщения, а не Facebook. Краткое описание действительно так.

1) Количество пользователей (таблица пользователей) 2) Один человек может отправить сообщение одному или нескольким лицам. 3) Может быть несколько ответов на одно и то же сообщение. 4) Если его отправить нескольким людям. Все могут ответить, и это шоу для всех них.

используемые таблицы

таблица сообщений

id
timestamp
sender_id
subject
message
due_date
urgent_flag
open_flag
reply_id

message_user (таблица)

id
timestamp
message_id
receiver_id
read_flag

Соотношения CakePHP следующие:

Модель сообщения

var $hasMany = array(
        'MessageUser' => array(
            'className'     => 'MessageUser',
            'foreignKey'    => 'message_id',    
                )
    );  
var $belongsTo = array (
    'User' => array (
        'className' =>  'User',
        'foreignKey' => 'sender_id',
    )
);
var $hasAndBelongsTo=array(
    'Message' => array (
        'className' => 'Message',
        'foreignKey' => 'reply_id',
       )
);

Модель MessageUser

var $belongsTo = array (
    'User' => array (
        'className' =>  'User',
        'foreignKey' => 'receiver_id',
    ),
    'Message' => array (
        'className' =>  'Message',
        'foreignKey' => 'message_id'

    )
);

Вопросы:

1) Мой подход правильный? Или схема базы данных должна быть пересмотрена. 2) Если да, как я должен получить данные для входящих? Это немного сложно, так как я хочу показать разговор для тех сообщений, которые мне отправили.

Например, пользователь 1 отправляет сообщение пользователю 2. Пользователь 2 добавляет 2 ответа к тому же. Тогда в папке «Входящие» пользователей 1 должно отображаться только 1 сообщение. и когда я открою это. он также покажет предыдущие сообщения .. (это похоже на facebook)

Еще одна проблема, которую я вижу здесь, - Как удалять сообщения? Предположим, что пользователь 1 удаляет сообщение, которое он не должен показывать в своем почтовом ящике. но пользователь 2 может видеть весь разговор, который у него был.

1 Ответ

0 голосов
/ 24 февраля 2010

WRT вашей схемы, я бы установил отношения только в том направлении, в котором вам нужно получить к ним доступ. Таким образом, если вам не нужно когда-либо получать доступ к пользователю, получающему сообщение, не связывайте сообщения с пользователями. Это может создать некоторые проблемы рекурсии, когда ваши модели будут автоматически извлекать слишком много данных, потому что у вас есть циклический цикл (User hasMany Message, Message HasMany User и т. Д.) На самом деле это отношение HABTM, поэтому используйте его вместо hasMany если вы хотите, чтобы это были двусторонние отношения).

В моем комментарии упоминается поведение дерева. Проще говоря, это позволяет легко хранить иерархические данные в таблице реляционной базы данных. Я не буду повторять руководство, но посмотрите http://book.cakephp.org/view/91/Tree и поищите примеры. Я почти уверен, что это то, что вы хотите использовать для многопоточных ответов.

Еще одно предостережение: если вы собираетесь использовать это с серьезной пользовательской базой, запустите несколько нагрузочных тестов для этой части вашей базы данных. Я не уверен, насколько хорошо TreeBehavior будет работать с миллионами строк на дешевом сервере.

...