CakePHP Создание дочерних моделей для разных типов комментариев
У меня есть Comment
Модель, которую я использую для хранения комментариев для обоих Goal
с и Note
s.
Текущая реализация имеет GoalComment
Модель и NoteComment
Модель, каждая из которых extends Comment
и Comment
"s 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 ответ
Я думаю, что вы правы, осознав, что вы слишком продумали ассоциации.
"Нормальный" способ для этого типа отношений - просто использовать поля model
а также foreign_key
в вашей таблице комментариев.
//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')
)
);