2

YAML データコンテンツを MySQL データベースに保存、変更、取得する機能が必要です。

私のプロジェクト(および質問)の目的:

  • .yml ファイルを解析して PHP 多次元配列にする
  • これらをMySQLデータベースに保存します
  • データベースの主な目的内で個々の値を変更できるようにする
  • データベースから値を取得し、解析して .yml ファイルに戻します

ステップ 1 - YAML ファイルの例

string 'name:
  singular: null
  plural: null
fields:
  price:
    label: Preis
  company_id:
     label: null
     placeholder: null'

ここで注意すべき重要なことは、ネストされたキーの数に制限がなく、キーと値が同じ名前/データを持つ可能性があることです。

ステップ 2 - これを PHP 配列に配置する

Spyc というライブラリを使用して YAML を解析しています。これはうまくいきます!それは私に次のことを与えます:

array
  'name' => 
    array
      'singular' => null
      'plural' => null
  'fields' => 
    array
      'price' => 
        array
          'label' => string 'Preis' (length=5)
      'company_id' => 
        array
          'label' => null
          'placeholder' => null

私の次の目標は、これらをそれぞれ MySQL データベースに格納することです。そう...

ステップ 3 - CSV

foreach()ここでは、基本的にこれらの詳細を次の配列に分割するための s の長いリストである独自の関数を作成しました。

array
   0 => string 'name||singular||' (length=16)
   1 => string 'name||plural||' (length=14)
   2 => string 'fields||price||label||Preis' (length=27)
   3 => string 'fields||company_id||label||' (length=27)
   4 => string 'fields||company_id||placeholder||' (length=33)

ステップ 4 - MySQL データベース

論理的には、これらの文字列をデータベースに保存しようとしています。スキーマがわかりません。end($array[$key]値は列にあり、キー列には配列の残りの要素が含まれると思います。

これにより、データベース内の値を変更してから、値を取り出して解析し、.yml ファイルに戻すことができます。

ステップ 5 - 道に迷った!

だから私は今何をすべきかわからない。現在、これらの文字列を次のロジックで解析しようとしています。

  • 最後の値end($array[$key]が値で、配列内の前のすべての要素が親キーです
  • そのコードが機能するようになったら、これらの文字列を効果的に配列に戻すことが次の優先事項になります

これを行うためのより良い方法が必要です。私の主な目的は、データベース内の個々の値を更新できるようにすることです。私の主な問題は、配列の次元数が一定ではないという事実です。

どうすれば助けられるか

私に申し出てください:

  • 私のプロジェクトの目的を達成するためのより適切な方法がある場合 (トップを参照)
  • このデータをデータベースに保存して、値を簡単に変更できるようにする最善の方法 (たとえば、null手順 1 で表示される s)
  • データベースからこのデータを返すと、これらのキーと値を元の配列の正確な構造に戻す PHP 関数(ステップ 2) を使用して、Spyc を使用してこれを YAML に変換し、.yml ファイルに出力できるようにします。
4

1 に答える 1

3

YAML としてシリアル化できるキー値ストアを作成する場合は、おそらくそれを作成する必要があります。

CREATE TABLE key_values(
  id INT PRIMARY KEY AUTO_INCREMENT,
  parent_id INT,
  type VARCHAR(255),
  key VARCHAR(255),
  value VARCHAR(255)
)

この場合、idはルート レコードを参照する方法であり、parent_idは子レコードでリンクするためのメカニズムでtypeあり、配列マップとインデックス付き配列を区別するために使用されます。それぞれの値を格納するために使用されますkeyvalue

これで、適切なレコードを作成できるはずです。

データの例として、ルート ノードを作成することがあります。

INSERT INTO key_values VALUES (parent_id, type, key, value)
  VALUES (NULL, 'map', NULL NULL)

次に、前の 1 であるとname推定されるキーの値を追加します。idINSERT

INSERT INTO key_values VALUES (parent_id, type, key, value)
  VALUES (1, 'map', 'name' NULL)

このプロセスは、値ごとに再帰的に繰り返されます。

INSERT INTO key_values VALUES (parent_id, type, key, value)
  VALUES (2, 'string', 'singular' NULL),
         (2, 'string', 'plural' NULL)

いずれにせよ、これらすべてのラッパー クラスを作成する必要があります。そうしないと、複雑すぎて使用できなくなります。

LONGTEXT実際には、YAML をフィールド内にそのまま格納して 1 日で終了するよりも、この問題をすべて解決する方がはるかに簡単かどうかはわかりません。通常、操作と再保存にはそれほど費用はかかりません。多層ツリー構造を反復することです。

revisionただし、純粋な YAML アプローチの競合状態で書き込みを踏みにじらないように注意する必要がありますが、それは、保存しているバージョンを追跡する列を使用して解決できないものではありません。UPDATE一致しないように構築します。

UPDATE yamls SET value='...', revision=93 WHERE id=20 AND revision=92

他のプロセスがすでに更新されている場合、クエリの実行に失敗し、それに応じて処理できることがわかります。

于 2012-11-29T15:27:43.920 に答える