database - 如何设计数据库以存储 "default"项

标签 database laravel laravel-5 database-design

我正在用 Laravel 开发一个应用程序。我有名为 Account 和 ShippingAddress 的模型。一个 Account 可以有一个或多个 ShippingAddress,但一个 ShippingAddress 只能有一个 Account。所以我使用的是一对多关系。

现在我想实现一项将 ShippingAddress 标记为“默认”的功能,并且每个“帐户”只能有一个“默认送货地址”。我确定了两种可能的解决方案:

  1. 在 ShippingAddress 表中添加“is_default”列。
  2. 创建一个“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/

相关文章:

MySQL数据类型来存储值对?

PHP - 在 foreach 循环之外保存到数据库

javascript - 从没有页面刷新的模式异步 Ajax 保存 Laravel 5.2

php - Laravel 5 - Eloquent - 分页结果

html - 在 CSS 中向上移动图像

php - 将表与子查询结果连接起来

javascript - 更改 'option' 标记的值后的 Ajax 调用

mysql - 酒店预订率SQL问题

mysql - 在 Laravel 5.6 中注册时出错

Laravel 自定义列,嵌套关系