CakePHP中的单向一对一关联

时间:2013-04-26 16:52:08

标签: database cakephp

我知道如何做到这一点,但它似乎不是正确的惯例。我有一个Submission模型和一个Revision模型,每个模型都有相似的命名表。每个Submission都可以在Revision关系中与其关联一个或多个$hasManyRevision模型因此$belongsTo关系链接回Submission

除了拥有此关系之外,Submission模型还需要与activeRevision关系式中的特定Revision建立另一个关联(称为$hasOne)。但是,$hasOne类型要求外键位于Revision表中。我希望它位于Submission表中,因此我不需要查询所有Submission的{​​{1}}来查找活动的Revision。我意识到在$belongsTo中指定一个Submission关系会做我想要的,但这对我来说是错误的,因为现在这两个模型“属于彼此”。

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

1 个答案:

答案 0 :(得分:1)

由于关系的'命名',我不会太担心。通过在提交表中包含 Revision 的外键,CakePHP ,事实上,你已经创建了'belongsTo'关系。

虽然不是严格'正确'(?)关系,但在这种情况下,这似乎是实现您想要的简单方法。只需确保为您的关系添加一个附加条件,以防止将另一个提交的修订版设置为当前版本,即。;

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

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

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

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