CakePHP Создание дочерних моделей для разных типов комментариев

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

Текущая реализация имеет 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')
    )
);
Другие вопросы по тегам