我会根据以下因素来决定:
1.可用值的数量:
如果它只是一组 2 或 3 个预定义值,例如优先级 High、Medium、Low.. 我更愿意将其作为常量放在代码库中。因为极不可能添加任何新选项,例如 very low 或 very very low 等
如果值是预定义的,但数量很大,比如员工的技能集。我肯定会把它放在数据库表中。
2 。值变化的可能性:
如果这些值经常变化,并且您想通过管理面板将控制权交给用户来管理这些值,请务必将这些值存储在数据库表中。
3.使用频率:
如果这些值是您系统的核心,因此几乎所有查询都使用它来过滤结果,那么您还需要考虑性能:
例如:假设整个项目取决于High、Medium、Low 优先级。您需要使用优先级过滤几乎每个查询:
拥有常量将使priority 存储在tasks 表中:
$tasks = Task::whereIn('priority', [high_constant, low_constant])->get();
拥有一个单独的表 priorities 并与 tasks 使用 priority_id 外键有关系:
$task = Task::whereHas('priority', function($q){
return $q->whereIn('priority_name', ['high', 'low']);
})->get();
根据您拥有的数据数量和您执行的频繁查询,您可以检查影响性能的因素。如果差异非常小,我更喜欢考虑第 1 点和第 2 点的常量。
4.获取 ID 等附加功能:
假设您有一个页面来创建具有优先级下拉列表的新任务。
如果您有一个单独的表,则必须从priorities 表中获取该优先级的ID,以将其保存为外键,同时将任务保存在tasks 表中。 (虽然真的不是什么大不了的事,但值得一提)
如果你有常量,你可以直接保存那个值。
各有优缺点,我会在上面的第 1 点和第 2 点中做出选择。
另外,如果您要制作常量,我建议您制作一个带有 n 别名的 laravel facade,然后在其中定义常量。所以你可以在整个项目中使用它
Priority::HIGH 或 Priority::LOW