我在拉勒维尔开发一个应用程序。我有一个模型叫做Account和Shippingaddress。帐户可以有一个或多个Shippingaddress,但Shippingaddress只能有一个帐户。所以我用的是一对多的关系。
现在我要实现一个功能,将shipping address标记为“default”,并且每个“account”只能有一个“defaultshippingaddress”。我已经确定了两种可能的解决方案:
在shippingaddress表中添加一个“isu default”列。
创建一个“default_shipping_address”透视表,我将在其中存储“account_id”“和shipping_address_id”。
哪一个对你来说是最好的解决方案?为什么?在第二个例子中:如何通过透视表在laravel中实现一对一关系?

最佳答案

考虑到一个ShippingAddress只属于一个Account,使用透视表似乎有点多余,第一个解决方案在我看来更干净。
顺便说一句,您可以这样设计Models,或者类似于:

class Account extends Model
{
    public function shipping_addresses()
    {
        return $this->hasMany('App\ShippingAddress');
    }
    public function default_shipping_address()
    {
        return $this->hasOne('App\ShippingAddress')->where('is_default', true);
    }
}

class ShippingAddress extends Model
{
    public function account()
    {
        return $this->belongsTo('App\Account');
    }
}

这样,当您检索'shipping_addresses'模型时,您可以eager load'default_shipping_address'或仅Account,例如:
$account = Account::with('shipping_addresses')->find($id);
$account = Account::with('default_shipping_address')->find($id);

显然,您不需要同时使用eager loadshipping_addresses这两种关系,因为default shipping address已经包含了defaut shipping address。
您只需检查代码中是否只有一个存在验证(unique rule)或数据库constraints或两者都存在。

10-06 06:16