我在拉勒维尔开发一个应用程序。我有一个模型叫做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 load
和shipping_addresses
这两种关系,因为default shipping address
已经包含了defaut shipping address。您只需检查代码中是否只有一个存在验证(unique rule)或数据库constraints或两者都存在。