У меня есть модель 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
, и этопросто кажется мне более естественным.
У вас есть идея для лучшей реализации, или я должен пойти с приведенным выше? Спасибо!