我有一个网站,用户可以在其中转换文本文档并将其保存到我称为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."
}]
}
以上就是我的设想-但我不确定这是否是最佳方法吗?
$casts
返回content
作为数组-但正如results.content
所见,它既可以是字符串,也可以是数组。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."}]
答案 0 :(得分:1)
第一种方法很好,您需要重写getCastType方法,以回答以下问题Laravel 5 Eloquent, How to set cast attribute dynamically。因此,您可以采用不同的类型。由于字段数据类型取决于最大预期长度,因此它可能是Varchar
或Text
(假设您存储在此字段中的所有数据类型都是基于文本的)
假设您期望使用两种类型的string
和table
,并且希望将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存储在那里。
您可以做的是将表中的结果作为数组发送到后端,并在输入字段的名称上使用[]
在后端进行处理。
请发布您如何从表格中获取数据,以便我们进一步为您提供帮助,也许有人会告诉您如何使它起作用。