2

OK - これは簡単かもしれませんが、ATK4 のどこに何を入れる必要があるかを視覚化するのに苦労しています。

ID、名前、参照の列を持つテーブル (チーム) があります。id は自動インクリメント列であり、参照です。テーブルには、このような3つの行があります

 id,  name,     last_ref
 1,  'Team 1',  1000
 2,  'Team 2',  1000
 3,  'Team 3',  2000

列 id、name、team_id、team_ref を持つ別のテーブル (ストーリー) があり、データを入力すると次のようになります

 id, name, team_id, team_ref
  1, 'Story A', 1, 1001
  2, 'Story B', 1, 1002 
  3, 'Story C', 1, 1003
  4, 'Story D', 2, 1001
  5, 'Story E', 3, 2001

ストーリー テーブルへの挿入ごとに、チーム テーブルで team_ref が検索され、1 ずつインクリメントされ、ストーリー行に対して結果が格納されます。他の誰かがストーリー テーブルに新しい行を挿入した場合に備えて、last_ref フィールドもすぐに更新する必要があります。

上記をストーリー テーブルに挿入すると、チーム テーブルは次のようになります。各チームは独自のシーケンスを維持し、番号を順番に割り当てます。

 id,  name,     last_ref
 1,  'Team 1',  1003
 2,  'Team 2',  1001
 3,  'Team 3',  2001

ストーリー レコードが挿入されるページは CRUD ですが、ロジックを CRUD、ページ、またはモデル自体に挿入する必要があるかどうかはわかりません。挿入にのみ影響を与える必要があり、おそらく addField('last_ref') の defaultValue にする必要があると思いましたが、これを関数にすることはできますか?関数はどこで定義する必要がありますか?

必須ではありませんが、last_ref をインクリメントすると、現在のチームのテーブルで既に使用されている参照をスキップする必要があります (CRUD 以外の方法で挿入された場合)。

前もって感謝します。

4

1 に答える 1

1

確かに Model は、このようなデータベース関連のロジックに適した場所です。

テーブルをロックし、最大の要素を検索して参照を設定する beforeInsert 関数を再定義します。

function beforeInsert(&$data){
    $this->myLockTable();
    $next_ref = $this->myGetNextRef();
    $data['team_ref']=$next_ref;
    return parent::beforeInsert($data);
}
function afterInsert($id){
    parent::afterInsert($id);
    $team = $this->add('Model_Team')->loadData($this->get('team_id'));
    $team->set('last_ref',$this->get('team_ref'))->update();
    $this->myUnlockTable();
}

ここで「my」で始まる関数は、カスタム実装されたものです。

次に、モデルを適切に使用していると仮定すると、レコードを挿入する「他の手段」はなく、それらのエントリをスキップすることを心配する必要はありません。

于 2011-10-16T16:33:09.793 に答える