CakePHP Создание дочерних моделей для разных типов комментариев - PullRequest
3 голосов
/ 29 февраля 2012

У меня есть модель Comment, которую я использую для хранения комментариев как Goal s, так и Note s.

Текущая реализация имеет модель GoalComment и модель NoteCommentкаждый из которых extends Comment и Comment beforeFind выполняет следующее:

$queryData['conditions'][$this->name . '.' . $this->__type_field] = $this->name;

, что в основном устанавливает поле type модели Comment в значение GoalCommentили NoteComment, в зависимости от того, какой из этих классов выполняет find.

Эта реализация работала до сих пор, где я хочу удалить комментарии.Ниже приведена Модельная ассоциация для комментариев в целях:

var $hasMany = array(
    'Comment' => array(
        'className' => 'GoalComment',
        'foreignKey' => 'object_id'
    )
);

И в моем beforeDelete, где я хочу удалить все комментарии, связанные с целью, у меня есть:

$this->Comment->deleteAll(array('object_id' => $this->id));

Но яполучить следующую ошибку SQL:

SQL Error: 1054: Unknown column 'GoalComment.type' in 'where clause' [CORE\cake\libs\model\datasources\dbo_source.php, line 525]
Query: SELECT `Comment`.`id` FROM `comments` AS `Comment` LEFT JOIN `users` AS `Poster` ON (`Comment`.`poster_id` = `Poster`.`id`)
LEFT JOIN `goals` AS `Goal` ON (`Comment`.`object_id` = `Goal`.`id`)  
WHERE `object_id` = 52 AND `GoalComment`.`type` = 'GoalComment'

Это происходит из-за описанного выше действия beforeFind, которое добавляет GoalComment.type = 'GoalComment'.Это заставило меня переосмыслить весь подход к ситуации.

Итак, мой вопрос : как эти отношения должны быть повторно реализованы?Моя лучшая идея - отказаться от beforeFind в Comment и просто переделать отношение $hasMany так:

var $hasMany = array(
    'Comment' => array(
        'className' => 'Comment',
        'foreignKey' => 'object_id',
        'conditions' => array('Comment.type = "GoalComment"')
    )
);

Это извлечет все мысли из модели Comment, и этопросто кажется мне более естественным.

У вас есть идея для лучшей реализации, или я должен пойти с приведенным выше? Спасибо!

1 Ответ

4 голосов
/ 29 февраля 2012

Я думаю, что вы правы, осознав, что вы переосмыслили ассоциации.

"Нормальный" способ для этого типа отношений - просто использовать поля model и * 1004.* в таблице ваших комментариев.

//Comment model
public $belongsTo = array(
    'Goal' => array(
        'className' => 'Goal',
        'foreignKey' => 'foreign_key',
        'conditions' => array('Comment.model' => 'Goal')
    ,
    'Note' => array(
        'className' => 'Note',
        'foreignKey' => 'foreign_key',
        'conditions' => array('Comment.model' => 'Note')
    )
);

//Goal model
public $hasMany = array(
    'Comment' => array(
        'className' => 'Comment',
        'foreignKey' => 'foreign_key',
        'conditions' => array('Comment.model' => 'Goal')
    )
);

//Note model
public $hasMany = array(
    'Comment' => array(
        'className' => 'Comment',
        'foreignKey' => 'foreign_key',
        'conditions' => array('Comment.model' => 'Note')
    )
);
...