2017-01-13 2 views
1

Laravel 5.1 LTSでフォームカスタマイズシステムを構築します。ユーザーはフォームを作成し、そのフィールドとスタイルをカスタマイズし、それらを解放し、他のユーザーがフォームを記入することができます。jsonデータをmysqlに保存するには?

フロントエンド側では、Alpaca Formsを使用します。このパッケージでは、フィールドとデータはjsonでレンダリングされます。

ここで問題は、フィールドのjsonとdatas 'jsonをmysqlに格納する方法です(mongodbや他のnosqlデータベースを使用したくないので、私はすでにmysqlを使用しています。 JSONはこのようなものであるのNoSQLに対処する方法を知っている) :。

$("#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" 
}); 

Iは、フロントエンドJSONと今まで件のデータを保存するための一つの解決策を保存するための2つの解決策が出ているが、私は考えていません彼らは十分なので、私はここでより良いものを見つけるために援助を求めています。

保存フロントエンドJSON:

  1. リストフロントエンドJSONのすべての属性は、それとテーブルを作成し、すべての値を保存します。パッケージが変更されたら、私はテーブルを更新する必要があります。 フォームフィールドテーブルは次のようになります。

    | id | form_id |タイプ|名前|行| ... |

  2. jsonをkey-value配列に解決し、データベースに保存します。ユーザーがフォームを作成すると、テーブルに多くの行が挿入されることは好ましくありません。 フォームフィールドテーブルは次のようになります。

    | id | form_id |キー|値|

  3. save jsonを属性として保存します。私はMysql 5.7がjsonをサポートできると知っていますが、これに他の問題があるかどうかはわかりません.Laravel 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その質問の答えは私が欲しいものではありません...私は以下に挙げた解決策をいくつか持っていますが、十分に良いとは思いません。私はより良い解決策を求めています。または最適化...単に解決策ではない...状況が違う、私はlarvel 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として格納される列 を扱うときアレイキャスト型は特に有用です。たとえば、データベースはあなたの雄弁モデルにそれにアクセスすると、その属性にキャスト 配列が自動的にPHPの配列に 属性をデシリアライズします追加し、シリアル化されたJSONが含まれてい JSONまたはテキストフィールドのタイプを持っている場合:

<?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全体からのものです。

それはあなたが配列にキャストを回避するために、単純な

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

を行うことができ、あなたのaplaceで動作するように取得します。

+1

これまでは良い方法でした。どうもありがとう! – GoneWithSin

関連する問題