Laravel 模型 - 如何管理与查找的关系 table(动态枚举)
Laravel Model - How to manage a relationship with a lookup table (dynamic Enum)
这是我的第一个 Laravel 项目。我正在使用 Laravel 8.54
我的项目模型是 Batch
植物。 Batch
可以使用不同的 brand/type 袋装土壤,这将在名为“土壤类型”的下拉列表中选择。
这是一个相当有限的选项列表,但它可能会随批次而变化,并且最终可能会随着时间的推移添加数十种类型。用户想要一种方法,可以转到应用程序的设置区域,只需将新类型添加到列表中,一旦保存新类型,该类型就会出现在“土壤类型”下拉列表中。他们不想每次想要添加新类型或编辑现有类型时都联系开发人员。
所以查找 table 似乎是这里最合乎逻辑的选择。我已经阅读了关于使用各种枚举表示方法避免这种情况的一些关于 SO 的问题,但这似乎是满足用户对列表进行控制的愿望的唯一方法。
我的问题是,如何定义这两个模型(Batch 和 SoilType)之间的关系?我能想到的唯一解决方案是简单地向 Batch 模型添加一个 soil_type_id
,这将成为 SoilType 模型的外键。当我 save/update 批处理时,我必须将其明确设置为整数。
但是有更好的“Eloquent”方式来做这样的事情吗? None documentation 中的关系选项似乎很合适。
我认为你的想法是对的,如果你需要随着时间的推移添加/更新/删除一些东西,拥有一个 soil_type
table 是个好主意。
你的 table 结构应该是这样的:
soil_type
- id
- 姓名
- ...
批量
- id
- soil_type_id
- ...
对于模特来说,一个Batch
belongsTo
一个SoilType
。还有一个SoilType
hasMany
Batch
.
此外,为了方便起见,您可以将辅助方法添加到 SoilType
模型以获取格式化为下拉列表的数据:
class Batch extends Model
{
public function soilType()
{
return $this->belongsTo(SoilType::class);
}
}
class SoilType extends Model
{
public function batches()
{
return $this->hasMany(Batch::class);
}
public function getDropdownOptions()
{
$options = [];
foreach (static::all() as $type) {
$options[$page->id] = $type->title . ' (' . $page->name . ')';
}
return $options;
}
}
这是我的第一个 Laravel 项目。我正在使用 Laravel 8.54
我的项目模型是 Batch
植物。 Batch
可以使用不同的 brand/type 袋装土壤,这将在名为“土壤类型”的下拉列表中选择。
这是一个相当有限的选项列表,但它可能会随批次而变化,并且最终可能会随着时间的推移添加数十种类型。用户想要一种方法,可以转到应用程序的设置区域,只需将新类型添加到列表中,一旦保存新类型,该类型就会出现在“土壤类型”下拉列表中。他们不想每次想要添加新类型或编辑现有类型时都联系开发人员。
所以查找 table 似乎是这里最合乎逻辑的选择。我已经阅读了关于使用各种枚举表示方法避免这种情况的一些关于 SO 的问题,但这似乎是满足用户对列表进行控制的愿望的唯一方法。
我的问题是,如何定义这两个模型(Batch 和 SoilType)之间的关系?我能想到的唯一解决方案是简单地向 Batch 模型添加一个 soil_type_id
,这将成为 SoilType 模型的外键。当我 save/update 批处理时,我必须将其明确设置为整数。
但是有更好的“Eloquent”方式来做这样的事情吗? None documentation 中的关系选项似乎很合适。
我认为你的想法是对的,如果你需要随着时间的推移添加/更新/删除一些东西,拥有一个 soil_type
table 是个好主意。
你的 table 结构应该是这样的:
soil_type
- id
- 姓名
- ...
批量
- id
- soil_type_id
- ...
对于模特来说,一个Batch
belongsTo
一个SoilType
。还有一个SoilType
hasMany
Batch
.
此外,为了方便起见,您可以将辅助方法添加到 SoilType
模型以获取格式化为下拉列表的数据:
class Batch extends Model
{
public function soilType()
{
return $this->belongsTo(SoilType::class);
}
}
class SoilType extends Model
{
public function batches()
{
return $this->hasMany(Batch::class);
}
public function getDropdownOptions()
{
$options = [];
foreach (static::all() as $type) {
$options[$page->id] = $type->title . ' (' . $page->name . ')';
}
return $options;
}
}