CakePHP: Правене на сложно намиране

В моето приложение имам система за коментиране с нишки, която наричам съобщения за състояние. Имам няколко модела, както следва

потребители (id, име......)

status_messages(id, съобщение,......, user_id)

status_replies(id, съобщение,......, status_message_id, user_id)

това ли е правилният начин за писане на система за коментиране?

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

алт текст


person Harsha M V    schedule 11.10.2010    source източник


Отговори (3)


Не мисля, че имате нужда от 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, сякаш идват от отделна свързана таблица. По принцип дървовидната структура на едно ниво свързва записите с техните родителски записи в същата таблица.

person Abba Bryant    schedule 12.10.2010
comment
опитах се да направя това. но получавам грешка, която казва, че таблицата profile_reply не е намерена :( - person Harsha M V; 14.10.2010
comment
Трябва да настроите ProfileReply да използва таблицата със съобщения. book.cakephp.org/view/1059/useTable - person Abba Bryant; 15.10.2010
comment
страхотно, това работи :D не мога да изтегля записите правилно. Когато ProfileMEssages се изтеглят, как мога да се уверя, че id = pid само тези ProfileMessages. и когато рекурсивът се увеличи, за да изтегли ProfileReply, той също изтегля ProfileMessage под отговора. - person Harsha M V; 15.10.2010
comment
След като свърша работа, ще създам няколко модела и ще тествам заявки и ще ги поставя някъде в кутия за вас. - person Abba Bryant; 15.10.2010

Ако искате система за коментари с нишки, трябва да обмислите използването на Дърво или MultiTree поведение с find('threaded').

person Adam    schedule 11.10.2010
comment
Прав си, че това може да е полезно, ако той реши да използва дълбоки нишки, но за подход с едно дете е малко прекалено. От документите на CakePHP за поведението на дървото: For small trees of data, or where the data is only a few levels deep it is simple to add a parent_id field to your database table and use this to keep track of which item is the parent of what. - person Stephen; 11.10.2010

Използвайте Containable Behavior в модела public $actsAs = array('Containable');

След това от потребителския контролер:

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

Това е само пример. В зависимост от това къде правите намирането, бихте променили леко кода по-горе. Бих препоръчал връщането на резултатите от намирането от моделен метод вместо контролер, така че да може да се използва повторно. (Използвах пример за контролер за по-лесно разбиране.)

person Stephen    schedule 11.10.2010
comment
получавам тази грешка Потребителят на модела не е свързан с Потребителя на модела [CORE\cake\libs\model\behaviors\containable.php, ред 363], когато правя това $status = $this-›User-›StatusMessage-›find( 'first', array('contain' =› array('StatusMessageReply' =› array('User' =› array('condition' =› array('User.id' =› 1 ) ) )))); - person Harsha M V; 17.10.2010
comment
Звучи сякаш правите намирането от метод във вашия потребителски модел. Горният код предполага, че е в контролера. За модела направете същото, но вместо $this->User->find просто използвайте $this->find - person Stephen; 18.10.2010
comment
О, чакай... Откъде се обаждаш? - person Stephen; 18.10.2010
comment
вътре в действие в потребителския контролер - person Harsha M V; 20.10.2010