雄辩的一对一关系,其中模型应该是hasOne?

时间:2018-05-23 17:20:37

标签: php laravel

我有一个用户可以在会议中进行注册的上下文。注册可以免费或支付,具体取决于进行注册的用户选择的票证类型。

疑问1:但是注册和付款之间应该存在1比1的关系。我怀疑的是,“hasOne”应该在注册模型还是支付模式中?或者它是一样的?在哪里有必要添加fk?在create_payments_table或“create_registrations_table”中,还是两者兼而有之?

疑问2:此外,还有2种付款方式,信用卡或参考。在引用的情况下,必须将生成的引用存储在引用表中。因此,付款和参考之间也应该存在1比1的关系。但是我对hasOne应该在哪里有同样的疑问?在付款或参考模型中?在哪里有必要添加fk?在create_payments_table或“create_references_table”中,还是两者兼而有之?

怀疑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');
    }
}

1 个答案:

答案 0 :(得分:1)

Laravel使用的惯例在理解后可能有助于澄清您的结构:

hasX 关系(hasOnehasManyhasManyThrough等)表示外键位于子/外关系。

User有一个Phone。用户表不知道手机。电话表格有user_id列。

belongsTo 关系表示当前表具有引用另一个表的外键。

Phone属于User

你的“怀疑1”型号代码效果很好,是我建议使用的。您可以在registration_id表中放置payments外键。这可以确保付款始终引用特定的注册(没有孤立的付款,您不确定是什么用途),并且由于注册可能甚至没有付款,您不会留下空值,而您不是确定是正确的。

至于“怀疑2”和参考资料,如果参考资料对付款总是唯一的,或者如果一个参考资料可用于多次付款,则取决于️。

如果每个付款都只有一次使用唯一参考,那么可以应用相同的关系。 {/ 1}}外键将添加到参考表/模型,付款有一个参考,参考属于付款。

如果可以将参考应用于多个付款,则payment_id表格需要payments列。付款属于参考,参考有很多付款。

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