我有一个动态添加产品表单,可以在其中访问与类型相关的字段和类别。
如果type_id为1,则我根据类型id添加产品,然后type_id 1相关字段和类别显示在添加产品表单上。
现在的问题是,当第一次显示type_id的URL加载字段列表而第二次显示时,如果产品表具有该字段,则仅检查第一个字段,然后跳过其他字段。
public function create($id){
$type = Type::find($id);
$category = Category::all();
foreach ($type->field as $key => $value) {
if ( Schema::hasColumn('products', "{$value->fieldname}") ) {
return view('products.create', compact('type', 'category'));
} else {
if( ! Schema::hasColumn('products', "{$value->fieldname}") ) {
foreach ($type->field as $key => $value) {
Schema::table('products', function ($table) use ($value) {
$table->string("{$value->fieldname}")->nullable()-> after('category_id');
});
}
return view('products.create', compact('type', 'category'));
}
}
}
}
答案 0 :(得分:0)
将这样的列动态添加到表中可能不是最佳实践。但是,如果需要,可以使用一个单独的表来保存元信息,以便可以根据需要轻松添加/删除“列”。
例如,您可以像这样设置元表:
create table `products_meta` (
products_id int(11),
column_name varchar(255),
value varchar(255),
)
然后在您的产品模型中,添加获取,插入,检查是否存在等功能。
public function getMeta($column) {
$meta = DB::table('products_meta')
->select('column_name', 'value')
->where('products_id', '=', $this->id)
->where('column_name', '=', $column)
->get();
if (!$meta->isEmpty()) {
return $meta;
} else {
return null;
}
}
public function addMeta($column, $value) {
DB::table('products_meta')->insert(
[
'products_id' => $this->id,
'column_name' => $column,
'value' => $value,
]
);
}