我知道如何做到这一点,但它似乎不是正确的惯例。我有一个Submission
模型和一个Revision
模型,每个模型都有相似的命名表。每个Submission
都可以在Revision
关系中与其关联一个或多个$hasMany
。 Revision
模型因此$belongsTo
关系链接回Submission
。
除了拥有此关系之外,Submission
模型还需要与activeRevision
关系式中的特定Revision
建立另一个关联(称为$hasOne
)。但是,$hasOne
类型要求外键位于Revision
表中。我希望它位于Submission
表中,因此我不需要查询所有Submission
的{{1}}来查找活动的Revision
。我意识到在$belongsTo
中指定一个Submission
关系会做我想要的,但这对我来说是错误的,因为现在这两个模型“属于彼此”。
有没有更好的方法来解决这个问题?
答案 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不支持部分索引,所以你运气不好