sql >> データベース >  >> RDS >> Mysql

CakePHP:代わりに新しいHABTM行を作成すると他の行が更新されます

    わかりました、これが私が考えている 起こっている:

    あなたは超便利なHABTM関係魔法を使用していません。このテーブルを単なるリレーションテーブルとして扱う代わりに、cakeは定義されたモデルに移動し、定義したリレーション、primaryKeys、displayFieldsなどを確認します。

    複雑なHABTMテーブルがある場合は問題ありません。ただし、その場合、Questionを追加しないため、データ配列がすべて台無しになります。 およびQset 別々に。私が言いたいのは、あなたがしていないということです

    $data = array('Question'=>array('title'=>'new_question'),
                  'Qset'=>array('name'=>'lets say qset'));
    $this->Question->saveAll($data);
    

    そうすることで、ケーキにHABTMの関連付けを解決させることができ、そのデータ構造は問題ありません。ただし、モデルフォルダに独自のQsetsQuestionモデルがあります。したがって、保存するデータは、他のテーブルと同じようにする必要があります

    $data = array('qset_id'=> $qset_id,
                  'question_id'=> $question_id);
    $this->Question->QsetsQuestion->save($data);
    

    そして、それはあなたが望むように、新しい関係で、qsets_questionsテーブルに新しいIDを作成します。

    ただし、これには独自のモデルを使用しているため、検証を正しく設定しないと、同じ外部キーのペアが何度も存在する可能性があることに注意してください。デフォルトでは、ケーキはIDが一意である必要があることを確認するだけです。 。

    [編集] 少し説明した後、上記の解決策は「問題」を解決しますが、実際にはこの動作の理由ではありません。

    Cakephpには機能

    したがって、新しい行を追加する場合、cakeは以前のすべての関連付けを削除し、新しい関連付けを追加します。これを解決する方法は、すべてのQsetsを見つけることです。 質問に属し、$dataに追加します 配列(追加する新しい質問の関連付けを追加)。 このリンク HABTMの関連付けを理解するのに役立ちました(「チャレンジIV」を探してください)。

    私が以前に与えた解決策が「問題」を解決するのに役立ったことは知っていますが、それはあなたがQsetsQuestionを持っているという印象の下で作られました どこかにモデルファイル。そうしないので、解決策はすべてのQuestionsを取得することです。 関連付けて、それらを新しいアレイとして追加します。 または 実際にQsetsQuestionを作成します モデルを作成し、次のように関連付けます:

    Qset hasMany QsetsQuestion
    QsetsQuestion belongsTo Qset, Question
    Question hasMany Qsets.
    

    またはケーキの振る舞いを変えてください...どれもきれいに見えません、私は知っています。

    したがって、ソリューションの概要:

    • 新しいQset-Questionアソシエーションを保存するたびに、以前に保存されたアソシエーションを取得し、それを保存する配列に入れて保存します

      //find previously associated Qsets, lets say it's 1,2,3 and 4
      $data = array('Question'=>array('id'=>1),
                'Qsets'=>array('Qsets'=>array(1,2,3,4, $new_qset));
      $this->Question-save($data);
      

    QsetsQuestionがないことに注意してください 、存在しないので。 HABTMモデルは複雑ではないため、これが最初のオプションになるはずです

    または

    • QsetsQuestionを作成します モデルフォルダで、上記のように関連付けを変更します。コントローラの保存部分は次のようになります

      $data = array('qset_id'=>1, 'question_id'=>1)
      $this->Question->QsetsQuestion->save($data);    //also works with $this->Qset->QsetsQuestion
      

    これははるかに単純ですが(多分)、新しいファイルを作成する必要があり、以前に同様の関連付けがないことを確認することを忘れないでください(挿入する前に2-2タプルが存在するかどうかを確認してください)。簡単な検証ルールが機能するはずです。

    または

    • このためにcakephpの動作を変更します...これは好きではありません。



    1. ユーザー入力のフィルタリング

    2. IDに依存せずにMySQLの1行おきに選択しますか?

    3. SQL Server(T-SQL)の日付からISO週番号を返す

    4. MySQL Mixing Damerau–Levenshtein Fuzzy with Like Wildcard