我正在用 Laravel 开发一个应用程序。我有名为 Account 和 ShippingAddress 的模型。一个 Account 可以有一个或多个 ShippingAddress,但一个 ShippingAddress 只能有一个 Account。所以我使用的是一对多关系。
现在我想实现一项将 ShippingAddress 标记为“默认”的功能,并且每个“帐户”只能有一个“默认送货地址”。我确定了两种可能的解决方案:
- 在 ShippingAddress 表中添加“is_default”列。
- 创建一个“default_shipping_address”数据透视表,我将在其中存储“account_id”和“shipping_address_id”。
您认为哪一个是最佳解决方案,为什么?对于第二种情况:如何通过数据透视表在 Laravel 中实现一对一关系?
最佳答案
恕我直言,考虑到一个 ShippingAddress
只属于一个 Account
,使用数据透视表似乎有点多余,第一个解决方案对我来说看起来更清晰。
顺便说一句,你可以用这种方式或类似的方式设计模型
:
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');
}
}
这样你就可以eager load 'shipping_addresses'
或只有 'default_shipping_address'
当您检索 Account
模型时,例如:
$account = Account::with('shipping_addresses')->find($id);
$account = Account::with('default_shipping_address')->find($id);
显然,您不需要急于加载
这两个关系,因为shipping_addresses
已经包含默认送货地址。
您只需通过验证 ( unique rule ) 或数据库 constraints 检查您的代码中是否只有一个 默认送货地址
或两者兼而有之。
关于database - 如何设计数据库以存储 "default"项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57809978/