Php 雄辩的一对一关系,哪种模式应该是hasOne?

Php 雄辩的一对一关系,哪种模式应该是hasOne?,php,laravel,Php,Laravel,我有一个用户可以在会议中注册的上下文。根据注册用户选择的票证类型,注册可以是免费的,也可以是付费的 疑问1:但是注册和支付之间应该是1:1的关系。我的疑问是“hasOne”应该在注册模式中还是在支付模式中?还是一样?在哪里需要添加fk?在“创建\付款\表”或“创建\注册\表”中,还是同时在两者中 疑问2:还有两种付款方式,信用卡或推荐信。在引用的情况下,需要将生成的引用存储在references表中。因此,支付和参考之间也应该存在1:1的关系。但我同样怀疑哈桑应该在哪里?在付款模式中还是在参考模

我有一个用户可以在会议中注册的上下文。根据注册用户选择的票证类型,注册可以是免费的,也可以是付费的

疑问1:但是注册和支付之间应该是1:1的关系。我的疑问是“hasOne”应该在注册模式中还是在支付模式中?还是一样?在哪里需要添加fk?在“创建\付款\表”或“创建\注册\表”中,还是同时在两者中

疑问2:还有两种付款方式,信用卡或推荐信。在引用的情况下,需要将生成的引用存储在references表中。因此,支付和参考之间也应该存在1:1的关系。但我同样怀疑哈桑应该在哪里?在付款模式中还是在参考模式中?在哪里需要添加fk?在“创建\付款\表”或“创建\参考\表”中,还是同时使用这两种方式

疑问1型号:

// Registration Model
class Registration extends Model
    public function payment()
        {
            return $this->hasOne('App\Payment');
        }
    }

// Payment model
class Payment extends Model
{
    public function registration()
    {
        return $this->belongsTo('App\Registration');
    }
}
第2款车型:

// Payment model
class Payment extends Model
{
    public function registration()
    {
        return $this->belongsTo('App\Registration');
    }

    public function reference()
    {
        return $this->hasOne('App\Reference');
    }
}
// Reference model
class Reference extends Model
{
    public function payment()
    {
        return $this->belongsTo('App\Payment');
    }
}

Laravel使用了一个约定,当理解该约定时,可能有助于澄清您的结构:

hasX关系(
hasOne
hasMany
hasManyThrough
等)表示外键位于子/外部关系上

用户
有一部
手机
。用户表不了解电话。电话表有一个
user\u id

belongsTo关系意味着当前表具有引用另一个表的外键

手机
属于
用户

您的“怀疑1”模型代码将运行良好,我建议您使用它。您将在
付款
表中放置一个
注册\u id
外键。这可以确保付款始终引用特定的注册(没有您不确定用于何处的孤立付款),并且由于注册甚至可能没有付款,因此不会留下您不确定是否正确的空值

至于“疑点2”和参考文献,则视情况而定™️ 如果一个引用对一个付款总是唯一的,或者如果一个引用可以用于多个付款

如果每笔付款只有一次使用的唯一引用,则可以应用相同的关系<代码>付款\ id外键将添加到参考表/模型中,付款有一个参考,参考属于付款

如果一个引用可以应用于多个付款,则
付款
表将需要一个
引用id
列。支付属于参照,参照有多种支付方式


希望有帮助!快乐编程。:)

如果注册表与付款表具有一对一关系,则付款表要求将注册表id作为外键。注册模式将有hasOne,付款模式将有belongsTo方法。谢谢,你能解释一下为什么需要这样吗?他们遵循了这个惯例,这就是为什么他们在文档中提到这件事。如果您在注册时有付款id,则注册属于付款。同样用于参考和付款。如果付款具有参考id,则付款属于参考。但我不确定你的案子里有没有。它似乎有很多更适合您的情况。谢谢,但它等于在注册表上有付款id或在付款表上有注册id?那么hasOne就靠这个了?你能解释一下为什么它更合适吗?因为一次注册关联了一次付款,一次付款关联了一次注册。感谢您的精彩解释!你能更好地解释这一部分吗?“…而且由于注册甚至可能没有付款,所以不会留下一个不确定是否正确的空值。”?当然!如果注册有
payment\u id
列,并且不需要付款(例如免费注册),那么我假设您将
payment\u id
保留为空。这是完全正确的,它可能只是提供了一个机会,有人在查看您的数据库时希望得到付款,因为列就在那里。这不是一件关键的事情,只是不使用该选项的一个小小的额外好处(在我看来!)。