我有以下架构:
Modules
=======
id: PK
current_revision: FK to Revisions.Id, nullable
Revisions
=========
id: PK
current_revision
字段引用单个修订版ID或设置为null。
我的问题是如何在Laravel中正确建模这种关系。
到目前为止我是这样做的:
class Module extends Model
{
public function current_revision()
{
return $this->belongsTo(Revision::class, 'current_revision');
}
}
但是,我没有在revision
模型中执行反向操作,因为可以进行修订但没有分配module
。
这是建立这种关系的正确方法吗?
为什么以下$module->current_revision
没有输出修订集合?相反,它输出该字段的内容。
但值得一提的是以下工作正常:$module->current_revision()->getResults()
答案 0 :(得分:1)
关于您目前的关系:
由于current_revision只指向修订表上的一条记录,因此您可以期望您的关系返回单个修订版本模型,而不是集合。
您获取字段内容而不是模型的原因是您的字段和关系共享相同的名称。因此,当您要求$model->current_revision
时,Laravel会为您提供数据库中该字段的值。
解决此问题的最简单方法是重命名数据库列或关系名称。我通常会将_id附加到外键列,这样就不会有问题了。
关于反向关系:
即使列可以为空,也可以以相同的方式定义关系。如果没有与一个修订版相关的任何模块,$revision->module
(例如)将只返回null。