膳食日历 - 数据库架构 - Laravel

时间:2017-07-20 20:59:29

标签: laravel eloquent relational-database

我想建立一个餐饮套餐,在那里我可以设计餐点,并在一周内将它们与不同的餐点联系起来。 (早餐或晚餐从1-7起,为期7天)

我最初的想法是多对多的关系

计划A (不要认为它会起作用)

表:(例如)

meals:
  id
  name

package:
  id:
  name:

meal_package:
  meal_id
  package_id
  calendar_code: (enum of {1D, 2D .. 7D, 1B, 2B .. 7B})

类:(作为例子)

class Meal extends Model {
    public function packages() {
        return $this->belongsToMany(Package::class)->withPivot('calendar_code');
    }
}

class Package extends Model {
    public function meals() {
        return $this->belongsToMany(Meal::class)->withPivot('calendar_code');
    }
}

但是,附加和分离这些将更加困难..典型的多对多将不会有相同的2个实体相互链接不止一次,是吗?

我正在使用Laravel 5.4 ..

我愿意接受有关其他方法的建议。

我的另一个想法是改变它。

计划B (不要认为它是最佳的......)

表:(例如)

meals:
  id
  name

package:
  id:
  name:

meal_package:
  meal_id
  package_id
  calendar_code: (enum of {1D, 2D .. 7D, 1B, 2B .. 7B})

类:(作为例子)

class Meal extends Model {
    public function package() {
        return $this->hasMany(Package::class);
    }
}

class Package extends Model {

    public function d1_meal() {
        return $this->belongsTo(Meal::class);
    }

    public function d2_meal() {
        return $this->belongsTo(Meal::class);
    }

    ...

}

谢谢!

1 个答案:

答案 0 :(得分:0)

我为你做了一点ERD。

首先,也许下次尝试使用更好的术语:
"我想建立一个餐饮套餐,在那里我可以设计餐点并在一周内将它们与不同的餐点联系起来"

会更好地翻译成:
"我希望有一个菜单,其中包含可在一周内重复使用的多餐。"

术语在业务流程中非常重要,在编码时更为重要。 它使编码方式更易于理解 一本好书就是:'罗伯特塞西尔马丁的清洁编码'

现在讨论这个问题:

enter image description here

-Menuperiod有多个菜单 - 菜单属于菜单周期[X]
- 菜单由多餐组成 - 用餐可以在多个菜单中

[X]菜单周期有一个开始和结束日期,但它只是一个菜单的集合。它不一定必须是一周,它可以是2周,几天等等。(例如圣诞节时间,事件等) 如果需要未来的功能,这种设置可以提高性能。

菜单在特定日期发生,我们使用日期&该日期需要在其MenuPeriod的startdate和enddate之间(与menuperiodid(FK)相关联)。这发生在您的业务逻辑中。此设置还可以更轻松地将周菜从一周复制到另一周。

菜单出现在早餐(早餐),中午(午餐)或晚上(晚餐)。

示例:周二早餐的菜单包含3餐(培根和鸡蛋,羊角面包和沙拉)。

但是这种设置使得复制菜单也变得更加容易。例如:每天早上我们都有培根和鸡蛋 此外,餐点可以在特定持续时间的特定持续时间的多个菜单中。
所以,如果你想像披萨周或其他什么一样,请打电话给我。

希望这有帮助!

PS:对于实际的collumntypes,我把它留给你。
menuperiod也有一个名称,除非你想命名你的菜单周期,例如' chickenweek'或者着名的“比萨饼周刊”。但如果它是一个纯日历,你可以打印出你的开始和结束日期作为字符串。