0

図 1: モデル クラスの例を次に示します。

class Games {
    public $id = 0;
    public $date = null;
    public $player1_id = 0;
    public $player2_id = 0;
    public $score = null;

    public function save(){
        if(empty($this->id)){
            // do INSERT here
        }
        else{
            // do UPDATE here  
        }
    }
}

図 2: クラスの使用例

// Save a new date to an existing game
$game = new Games;
$game->id = $input['id'];
$game->date = $input['date'];
$game->save();

figure2UPDATEに基づいてクエリを実行すると、、、およびの値が間違ってゼロ/ヌルに上書きされます。したがって、特定のプロパティがfigure2の呼び出しから設定されていないことをクラス内から判断する方法が必要です。これにより、データベース内の特定のフィールドのみを更新するようにクエリを動的に変更できます。それとも私はこれに間違って近づいていますか?player1_idplayer2_idscoreUPDATE

注: 単一のarrayプロパティを使用してすべてのフィールドを保持する (および を使用するisset) ことができることはわかっていますが、これはモデルのポイントを壊しているように感じます。配列が厳密に型指定されている Java などの言語?)。また、更新を実行する前に、ORM が行うと考えていることを実行して、最初のSELECTクエリを作成できることにも気付きました (しかし、それは非常に非効率的です!)。

4

3 に答える 3

0
  1. PRISTINE 定数を宣言します。作成したオブジェクトの新しいインスタンス、たとえば new MyPristine に設定してみてください。
  2. Game コンストラクターで、すべてのフィールドをその定数に設定します。これは、それらを「手付かず」としてマークするためのトリックです。Reflection ( ReflectionClass($game)->getProperties() など) を使用して、それらすべてをループできます。
  3. 保存する前に、フィールドを再度ループし、PRISTINE で値をテストします。異なる場合は、変更する必要があります。

このソリューションでは、ステップ 2 と 3 の間で Game インスタンスが変更されることはないと想定しています。そのため、ほとんどの ORM は事前に SELECT を実行します。

于 2015-01-27T03:00:28.510 に答える
0

更新する前にオブジェクトを選択してください。そうすれば、UPDATE ステートメントにすべてのフィールドが含まれます。

また、これにより、IDが存在することを確認できます。

于 2015-01-26T23:24:24.290 に答える