CakePHP: Doing Complex Find - PullRequest
       14

CakePHP: Doing Complex Find

1 голос
/ 11 октября 2010

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

пользователей (идентификатор, имя ......)

status_messages (идентификатор, сообщение, ......, user_id)

status_replies (id, message, ......, status_message_id, user_id)

это правильный способ написания системы комментирования?

Пользовательможет устанавливать статус сообщения и своих друзей, а сам может отвечать на него.если другой пользователь ответит, я бы тоже хотел вытащить его данные.

alt text

Ответы [ 3 ]

1 голос
/ 11 октября 2010

Если вам нужна система многопоточных комментариев, вы должны рассмотреть возможность использования Tree или MultiTree , с find('threaded').

1 голос
/ 12 октября 2010

Я не думаю, что вам нужно 2 стола.

Используйте одну таблицу сообщений и создайте 2 модели, которые обе используют эту таблицу.

I.E table = messages, Models = ProfileMessage, ProfileReply

In that table make sure there is a profile_id, a user_id
and a parent_id. Default all of these to null.

Relate the ProfileMessage as
    belongsTo User, 
    belongsTo Profile,
    hasMany ProfileReply

Relate the ProfileReply as
    belongsTo ProfileMessage using the foreignKey key in the association to make sure you reference the parent_id and profile_id,
    belongsTo User

Затем вы можете просто запросить ProfileMessage, и он должен показать все дочерние объекты ProfileReply, как если бы они пришли из отдельной связанной таблицы. По существу, древовидная структура одного уровня связывает записи с их родительскими записями в той же таблице.

1 голос
/ 11 октября 2010

Использование контейнерного поведения в модели public $actsAs = array('Containable');

Затем из контроллера пользователя:

$userWithMessagesAndReplies = $this->User->find('first' => array(
        'conditions' => array(/* conditions for finding the user (User.id) */),
        'contain' => array(
            'StatusMessage' => array('StatusReply')
        )
    )
);

Это всего лишь пример.В зависимости от того, где вы находите, вы немного измените приведенный выше код.Я бы рекомендовал возвращать результаты поиска из модельного метода вместо контроллера, чтобы его можно было многократно использовать.(Я использовал пример контроллера для простоты понимания.)

...