Хранение динамического массива и строки - PullRequest
0 голосов
/ 10 июля 2019

У меня есть веб-сайт, где пользователи могут преобразовать текстовый документ и сохранить его в том, что я называю 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) введены в мою базу данных, я хотел бы отправить веб-крюк с данными поля, такими как:

{
  "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 ]

1 голос
/ 11 июля 2019

Первый подход хорош, вам нужно переопределить метод getCastType, как упоминалось в ответе на следующий вопрос Laravel 5 Eloquent, Как динамически установить атрибут приведения . Таким образом, вы можете принять разные типы. Для поля тип данных зависит от максимальной ожидаемой длины, поэтому он может быть либо 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');
}

Всего наилучшего

0 голосов
/ 10 июля 2019

Самый простой и уродливый способ сделать это - добавить столбец BLOB в вашу базу данных (таблицы) и просто сохранить там JSON.

Что вы можете сделать, это отправить результаты из таблицы какмассивы в бэкэнд и обработайте его там, используя [] в именах полей ввода.

Пожалуйста, опишите, как вы получаете данные из таблицы, чтобы я мог помочь вам в дальнейшем, и кто-то, вероятно, расскажет вам, как выможно заставить это работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...