2017-01-13 4 views
1

Я собираюсь создать систему настройки формы с Laravel 5.1 LTS. Пользователь может создавать формы, настраивать свои поля и стили, выпускать их, тогда другие пользователи могут заполнить форму.Как сохранить данные json в mysql?

В передней части я собираюсь использовать Alpaca Forms. С помощью этого пакета поля и данные отображаются с помощью json.

Теперь проблема заключается в том, как я могу хранить json и js-файлы json для mysql? (Я действительно не хочу использовать mongodb или другие базы данных nosql, потому что я уже использую mysql сейчас, и я не знаю, как бороться с NoSQL) JSON как это:.

$("#form").alpaca({ 
    "data": { 
     "name": "Diego Maradona", 
     "feedback": "Very impressive.", 
     "ranking": "excellent" 
    }, 
    "schema": { 
     "title":"User Feedback", 
     "description":"What do you think about Alpaca?", 
     "type":"object", 
     "properties": { 
      "name": { 
       "type":"string", 
       "title":"Name", 
       "required":true 
      }, 
      "feedback": { 
       "type":"string", 
       "title":"Feedback" 
      }, 
      "ranking": { 
       "type":"string", 
       "title":"Ranking", 
       "enum":['excellent','ok','so so'], 
       "required":true 
      } 
     } 
    }, 
    "options": { 
     "form":{ 
      "attributes":{ 
       "action":"http://httpbin.org/post", 
       "method":"post" 
      }, 
      "buttons":{ 
       "submit":{} 
      } 
     }, 
     "helper": "Tell us what you think about Alpaca!", 
     "fields": { 
      "name": { 
       "size": 20, 
       "helper": "Please enter your name." 
      }, 
      "feedback" : { 
       "type": "textarea", 
       "name": "your_feedback", 
       "rows": 5, 
       "cols": 40, 
       "helper": "Please enter your feedback." 
      }, 
      "ranking": { 
       "type": "select", 
       "helper": "Select your ranking.", 
       "optionLabels": ["Awesome!", 
        "It's Ok", 
        "Hmm..."] 
      } 
     } 
    }, 
    "view" : "bootstrap-edit" 
}); 

я придумал два решения для сохранения переднего плана и один JSON решением для сохранения ДАННЫХ до сих пор, но я не думаю, они достаточно хороши, поэтому я прошу помочь найти лучшего.

Сохранить передний конец JSON:

  1. список всех атрибутов фронтального JSON, создать таблицу с этим и сохранить все значения. Нехорошо распространяться, если пакет меняется, я должен обновить таблицу. вид полевой таблицы похож:

    | id | form_id | тип | имя | строки | ... |

  2. разрешить json для массива ключей и сохранить его в базе данных. Нехорошо, если пользователь создаст форму, он добавит много строк в таблицу. вид полевой таблицы похож:

    | id | form_id | ключ | стоимость |

  3. сохранить json как атрибут. Я знаю, что Mysql 5.7 может поддерживать json, но я не знаю, есть ли какие-либо другие проблемы с этим. Larvel 5.1 не поддерживает json-поиск. Таблица форматов:

    | id | json |

Сохранить Данные в формате JSON:

  1. решительность JSON в массив ключ-значение и сохранить его в базу данных. Нехорошо, если пользователь заполнит форму, он добавит много строк в таблицу. таблица данных выглядит следующим образом:

    | id | form_id | ключ | стоимость |

Благодаря ~

+0

Возможный дубликат [Правильный способ хранения данных в базе данных SQL, когда столбцы неизвестны] (http://stackoverflow.com/questions/37109711/correct-way-to-store-data-in-sql-database-when -columns-are-unknown) – e4c5

+0

@ e4c5 да, это дублируется ... Но я использую Laravel 5.1 LTS ... И я не знаю, есть ли какие-либо проблемы с json как атрибутом? – GoneWithSin

+0

@ e4c5 Ответ на этот вопрос не то, что я хочу ... У меня есть некоторые решения, перечисленные ниже, но я не думаю, что они достаточно хороши. поэтому я прошу разрешения BETTER или ОПТИМИЗИРУЮТ ... не просто РЕШЕНИЕ ... и ситуация другая, я использую laravel 5.1, а не Django ... Laravel 5.1 не поддерживает поиск json. – GoneWithSin

ответ

2

в базе де есть текстовый столбец.

размеры от: text storage sizes

 
     Type | Maximum length 
-----------+------------------------------------- 
    TINYTEXT |   255 (28−1) bytes 
     TEXT |  65,535 (216−1) bytes = 64 KiB 
MEDIUMTEXT | 16,777,215 (224−1) bytes = 16 MiB 
    LONGTEXT | 4,294,967,295 (232−1) bytes = 4 GiB 

затем отметьте поле JSon как приведение к массиву в вашей модели.

protected $casts = [ 
    'options' => 'array', 
]; 

https://laravel.com/docs/5.3/eloquent-mutators#array-and-json-casting

Массив приведение типа особенно полезно при работе с колоннами , которые хранятся в последовательной форме JSON. Например, если ваша база данных в формат JSON или TEXT типа поля, содержащий сериализованную JSON, добавив, бросание массива в этот атрибут будет автоматически десериализация атрибута в PHP массив, когда вы к нему доступ на свои красноречивые моделях :

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class User extends Model { 
    /** 
    * The attributes that should be casted to native types. 
    * 
    * @var array 
    */ 
    protected $casts = [ 
     'options' => 'array', 
    ]; 
} 

После определения роли вы можете получить доступ к атрибуту options, и он будет автоматически десериализован из JSON в массив PHP . При установке значения атрибута опции, данная массив будет автоматически сериализовать обратно в формат JSON для хранения:

$user = App\User::find(1); 

$options = $user->options; 

$options['key'] = 'value'; 

$user->options = $options; 

$user->save(); 

Таким образом, вы можете сохранить ваши настройки в отдельных моделях, и имеют конфигурацию просто работать сам он от всего JSON, без максимальной гибкости.

Чтобы заставить его работать в вашей aplace вы могли бы сделать простой

MyModel::selectRaw('myjson_field as json_output')->where('id','1')->get()->first()->json_output 

обойти отливку в массив.

+1

Это хороший способ до сих пор. Огромное спасибо! – GoneWithSin

Смежные вопросы