2016-07-14 11 views
0

皆さん、現在、関連するテーブルの行を含むフォームを処理しています。課題:F3では、関連するテーブルの行が追加、変更、または削除される可能性のあるフォームを処理する最善の方法は何ですか?Fat-Free-Framework:DB SQL Mapperを使用して関連テーブルのレコードを追加/変更/削除する方法

DBスキーマ

practitioner 
------------------------------ 
id   | int(10) 
first_name | varchar(255) 
last_name | varchar(255) 
abn  | char(11) 
mobile  | varchar(20) 
email  | varchar(255) 

practice_site 
------------------------------ 
id   | int(10) 
name  | varchar(255) 

provider_number 
------------------------------ 
id    | int(10) 
practice_site_id | int(10) 
practitioner_id | int(10) 
provider_number | varchar(20) 

フォーム

  • プロバイダ番号が動的に追加され、フォーム名は、例えば、_nで修正されていますprovider_number_3
  • 削除ボタンは

    プロバイダ番号は何かビットに変換されprovider_number_1provider_number_3が、無provider_number_2

enter image description here

フォーム出力があるかもしれないという意味、完全に行を削除します*_nより管理しやすい

他のフィールド、idfirst_nameなどは、copyfrom()のおかげで簡単に更新されます。

Array 
(
    [id] => 1 
    [first_name] => Jon 
    [last_name] => Doctor 
    [abn] => 12345678902 
    [mobile] => 0491729472 
    [email] => [email protected] 
    [provider_numbers] => Array 
     (
      [0] => Array 
       (
        [provider_number] => ASBDF24 
        [practice_site_id] => 2 
       ) 

      [1] => Array 
       (
        [provider_number] => 1249FBK 
        [practice_site_id] => 2 
       ) 

     ) 

) 

フォームが送信されたときに、プロバイダ番号についてのいくつかの条件が発生する可能性が問題

  • 新しいプロバイダ番号がプロバイダの数がある
  • 追加されます変更された
  • 練習サイトが変更されました
  • プロバイダの数はこれについて行かするための最良の方法だろうどのように

を除去して? (好ましくはFat-Free-FrameworkのDB\SQL\Mapperクラスを使用します)。

考えられる解決策:

  • provider_id = POST.id
  • 形式ではありません、データベース内のすべてのレコードを検索しarray_diff()を実行しますが、その後のDELETE声明を行う既存のprovider_numberテーブルの配列を取得するために$db->exec()を実行します。それらのレコード。元の配列を切り捨てます。
  • provider_numberが一致するかどうかを調べる配列を横断します。そうであればpractice_site_idが違うので、更新してください。 practice_site_idが同じ場合は何もしないでください。
  • provider_numberが特定のものに対して変更されたかどうかを正確に判断する方法practice_site_id

別の可能性:

  • 変更形態でxfra35 @から提案後にデータベース
+1

あなたの最後の提案は、最も単純な解決策( 'provider_number.id'を含む)のように見えます。この方法では、 '$ providerNumber-> load(['id =?'、$ id])'が必要で、idが既存のレコードと一致するかどうかによってマッパーは自動的に挿入または更新されます。また、削除されたレコードを追跡する必要があります。これは余分な非表示のブール型 'erase'フィールドで実現できます。 – xfra35

答えて

0

から最新の利用可能なIDを取得、新しい行が追加されるprovider_number.idを含むこと私の質問では、私は2番目の可能性を持って行きました - provider_number.idをフォーム自体に追加し、そこから行くことになりました。さらなる提案や助言があれば、気軽に共有してください!

practice_site_1, practice_site_2, etcの代わりにprovider_numbers[provider_number][] and provider_numbers[practice_site_id][]に値が挿入されるようにフォームが変更されました。これにより、行を動的に挿入するためのコードが作成されましたとして*_nは、もはや追跡する必要はありません。

<div class="delete-array">がフォーム内に配置され、削除ボタンがクリックされるたびに、<input type="hidden" name="provider_numbers[delete][]" value="' + id + '" />が挿入されました。

新しいボタンはデータベースから次のAUTO_INCREMENT値をフェッチし、一度に複数のプロバイダ番号が追加されている場合は基本的なロジックを持ちます。 (警告:複数のユーザーが同時にでこの機能を操作する場合は解除されます)

var new_id; 
$('.btn-add-provider-number').click(function() { 

    if (typeof(new_id) === "undefined") { 
     $.getJSON({url:'{{ @BASE }}/provider_numbers/new_id.json', async:false}).done(function(data) { 
      new_id = data; 
     }); 
    } else { 
     new_id++; 
    } 

    var newRow = ' .... '; 
    $('.provider-numbers').append(newRow); 
} 

フォームが今提出して次のようになります。

Array 
(
    [id] => 1 
    [first_name] => Amy 
    [last_name] => Doctor 
    [abn] => 66627819264 
    [mobile] => 0472888798 
    [email] => [email protected] 
    [provider_numbers] => Array 
     (
      [delete] => Array 
       (
        [0] => 6 
       ) 

      [provider_number] => Array 
       (
        [0] => 64872HJF 
        [1] => 182947KD 
       ) 

      [practice_site_id] => Array 
       (
        [0] => 1 
        [1] => 2 
       ) 

      [id] => Array 
       (
        [0] => 1 
        [1] => 7 
       ) 
     ) 
) 

は、その後、以下で処理されますコード:

$updated = []; 
$provider_numbers = []; 
$provider_numbers_delete = []; 

foreach ($f3->get('POST') as $key => $val) { 
    if ($key == 'provider_numbers') { 
     foreach ($val as $pn_key => $pn_val) { 
      if ($pn_key !== 'delete') { 
       foreach ($pn_val as $pnk_key => $pnk_val) { 
        $provider_numbers[$pnk_key][$pn_key] = $pnk_val; 
       } 
      } else { 
       $provider_numbers_delete = $pn_val; 
      } 
     } 
    } else if (is_scalar($val) && $practitioner->exists($key)) { 
     $practitioner->set($key, $val); 
     $updated[] = $key; 
    } 
} 

if (!empty($provider_numbers)) { 
    foreach($provider_numbers as $pn) { 
     $provider_number->load(['id = ?', $pn['id']]); 
     if ($provider_number->dry()) { 
      $provider_number->set('practitioner_id', $f3->get('POST.id')); 
     } 
     $provider_number->copyfrom($pn); 
     $provider_number->save(); 
     $updated['provider_numbers'][] = $pn; 
    } 
} 

if (!empty($provider_numbers_delete)) { 
    foreach ($provider_numbers_delete as $pnd) { 
     $provider_number->load(['id = ?', $pnd]); 
     if (!$provider_number->dry()) { 
      $provider_number->delete(); 
     }  
    } 
} 
+1

NB:次のauto_increment idを推測する必要はありません。 'NULL'値で十分です。 – xfra35

+0

すごい!私はできるだけ早く修正する – mulquin

関連する問題