2013-04-26 7 views
0

У меня есть идея, как это сделать, но это не похоже на правильное соглашение. У меня есть модель Submission и модель Revision, каждая со своими таблицами с одинаковым именем. Каждый Submission может иметь один или несколько связанных с ним Revision s в отношении $hasMany. Модель Revision, следовательно, имеет отношение $belongsTo, ссылающееся на Submission.One Way One-to-One Association в CakePHP

В дополнение к наличию этого отношения, то Submission модель должна иметь другую ассоциацию (называемое activeRevision) к определенному Revision в $hasOne стиле отношений. Однако тип $hasOne требует, чтобы внешний ключ находился в таблице Revision. Я хочу, чтобы он находился в таблице Submission, поэтому мне не нужно запрашивать все SubmissionRevision s, чтобы найти активный. Я понял, что просто указание отношения $belongsTo в Submission будет делать то, что я хочу, но мне это кажется неправильным, так как теперь две модели «принадлежат друг другу».

Есть ли лучший способ сделать это?

ответ

1

Я бы не стал слишком беспокоиться из-за «именования» отношения. Имея внешний ключ Редакция внутри Представление стол, CakePHP , на самом деле, правильно, что вы создали отношение «принадлежит».

Хотя не строго отношение «право» (?), В этой ситуации это выглядит так, что это простой способ достичь того, чего вы хотите. Просто не забудьте добавить дополнительное условие к вашему отношению, чтобы исключить, что пересмотр другого сообщения может быть установлен как текущая версия, то есть;

public $belongsTo = array(
    'Revision' => array(
     'conditions' => array(
      'Revision.submission_id = Submission.id', 
     ) 
    ) 
); 

Однако, убедитесь, чтобы добавить надлежащее комментарий в коде, чтобы избежать путаницы, если вы (или кто-то другой), глядя на свой код на более позднем этапе. (Например, «примечание: использование belongsTo отношения, потому что его легче поддерживать)

Если вы действительно хотите, чтобы преобразовать его в hasOne отношения, вы должны добавить дополнительный столбец в таблице„ПЕРЕСМОТРЫ“, для пример «is_curreny_revision». Тем не менее, вы также должны быть уверены, что только один пересмотр представления может быть установлен пересмотр тока.

Если вы используете PostgreSQL, это может быть достигнуто с помощью «частично уникальный» индекс (см. этот вопрос в StackOverflow; PostgreSQL: Conditional unique constraint). MySQL не поддерживает частичные индексы, поэтому вам не повезло

+0

Достаточно хорошо для меня. И спасибо за то, что это лакомый кусочек. Мне было интересно, как это сделать. –

+0

Рад, что я мог помочь, учитывая это условие, это не помешает неправильной записи * сохраненной * в 'revision_id'. Вам нужно будет добавить (пользовательское) правило проверки в своей модели и/или ограничение в базе данных. – thaJeztah