0

我知道如何做到这一点,但它似乎不是正确的约定。我有一个Submission模型和一个Revision模型,每个模型都有类似名称的表。在关系中,每个都Submission可以有一个或多个Revision与之关联的 s $hasMany。因此,该Revision模型具有$belongsTo链接回Submission.

除了具有这种关系之外,Submission模型还需要与activeRevision特定关系风格的Revision另一个关联(称为 )。$hasOne但是,该$hasOne类型要求外键在Revision表中。我希望它在Submission表中,所以我不需要查询所有的SubmissionsRevision来找到活动的。我意识到只是指定一个$belongsTo关系Submission会做我想做的事,但这对我来说感觉不对,因为现在这两个模型“属于彼此”。

有没有更好的方法来解决这个问题?

4

1 回答 1

1

由于关系的“命名”,我不会太担心。通过在Submission表中拥有Revision的外键,CakePHP实际上正确的,您已经创建了一个“belongsTo”关系。

虽然不是严格意义上的“正确”(?)关系,但在这种情况下,这看起来是实现您想要的简单方法。只需确保在您的关系中添加一个附加条件,以防止可以将另一个提交的修订设置为当前修订,即;

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

但是,如果您(或其他人)在稍后阶段查看您的代码,请确保在您的代码中添加适当的注释以防止混淆。(例如“注意:使用 belongsTo 关系,因为它更容易维护)

如果您真的想将其转换为 hasOne 关系,则必须在“修订”表中添加一个附加列,例如“is_curreny_revision”。但是,您还需要确保只能将提交的一个修订版设置为当前修订版。

如果您使用的是 PostgreSQL,这可以使用“部分唯一”索引来实现(请参阅 StackOverflow 上的这个问题;PostgreSQL: Conditional unique constraint)。MySQL 不支持部分索引,所以你不走运

于 2013-04-26T20:59:12.703 回答