存储动态数组和字符串

时间:2019-07-10 11:40:44

标签: php mysql laravel

我有一个网站,用户可以在其中转换文本文档并将其保存到我称为field的位置。一个文本文档可以具有动态数量的字段,因此使我很难创建关系数据库设计。

请考虑以下设置。

我的模型Field.php的表fields下。

id | name       | type
-----------------------
1  | invoice_no | text
2  | addresses  | table

我还有一个表,用于保存特定文档的字段结果:

在模型Result上,我有一个$casts类型:

protected $casts = [
    'content' => 'array'
];

这是我的results表:

id | field_id | document_id | content
-------------------------
1  | 1        |  32         | #81724
2  | 2        |  32         | [{"0": "Parkway", "1": "Broadway"}, {"0": "Avenue St.", "1": "Main St."}]

仅从.json文件中读取表中的数据。

现在,最终,当将特定文档的所有字段(在这种情况下为32)输入我的数据库时,我想发送一个带有字段数据的webhook,例如:

{
  "invoice_no":"#81724",
  "addresses": [{
       "0": "Parkway",
       "1": "Broadway"
   },{
       "0": "Avenue St.",
       "1": "Main St."
   }]
}

以上就是我的设想-但我不确定这是否是最佳方法吗?

  1. 我的模型上的$casts返回content作为数组-但正如results.content所见,它既可以是字符串,也可以是数组。
  2. 如何将内容存储在数据库中?如果我也想存储字符串,则无法将列设置为JSON类型。

另一种方法?

results表上有两列用于内容会更有意义,所以它变为:

id | field_id | document_id | text    | array
----------------------------------------------
1  | 1        |  32         | #81724  | NULL
2  | 2        |  32         | NULL    | [{"0": "Parkway", "1": "Broadway"}, {"0": "Avenue St.", "1": "Main St."}]

2 个答案:

答案 0 :(得分:1)

第一种方法很好,您需要重写getCastType方法,以回答以下问题Laravel 5 Eloquent, How to set cast attribute dynamically。因此,您可以采用不同的类型。由于字段数据类型取决于最大预期长度,因此它可能是VarcharText(假设您存储在此字段中的所有数据类型都是基于文本的)

更新:

假设您期望使用两种类型的stringtable,并且希望将table类型强制转换为array,则可以覆盖getCastType方法如下:

protected function getCastType($key) {
      if ($key == 'content' && !empty($this->field->type)) {
        switch($this->field->type) {
            case 'table':
                return 'array';
            break;
            case 'string':
                return 'string';
            break;
            default:
                return parent::getCastType($key);
        }
      } else {
        return parent::getCastType($key);
      }
    }

并且要能够使用$this->field->type访问字段类型,您需要在结果模型中实现以下关系:

public function field() {
    return $this->belongsTo('App\Field');
}

万事如意

答案 1 :(得分:0)

到目前为止,最简单,最丑陋的方法是在数据库(表)中添加BLOB列,然后将JSON存储在那里。

您可以做的是将表中的结果作为数组发送到后端,并在输入字段的名称上使用[]在后​​端进行处理。

请发布您如何从表格中获取数据,以便我们进一步为您提供帮助,也许有人会告诉您如何使它起作用。