【问题标题】:Schema table in Laravel add column dynamicallyLaravel 中的模式表动态添加列
【发布时间】:2018-12-24 08:33:12
【问题描述】:

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

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

如果 type_id 为 1,我根据 type id 添加产品,然后 type_id 1 相关字段和类别显示在添加产品表单上。

现在的问题是,当第一次 URL 加载 type_id 的字段列表时,第二次时,如果产品表有该字段,则只检查第一个字段,然后跳过其他字段。

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

        }

    }
}

【问题讨论】:

    标签: php mysql laravel


    【解决方案1】:

    将这样的列动态添加到表中可能不是最佳做法。但是,如果您愿意,您可以使用单独的表格来保存元信息,以便您可以根据需要轻松添加/删除“列”。

    例如,您可以这样设置元表:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-01
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-04
      • 2013-07-24
      相关资源
      最近更新 更多