Laravel中的架构表会动态添加列

时间:2018-07-16 18:13:08

标签: php mysql laravel

我有一个动态添加产品表单,可以在其中访问与类型相关的字段和类别。

  1. 字段表具有字段名和ID
  2. 类型表具有标题。 字段和类型在模型中具有很多关系
  3. 类别表具有类别名称和类型ID
  4. 产品表具有类别ID和与产品相关的属性。

如果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'));
            }

        }

    }
}

1 个答案:

答案 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,
       ]
    );
}