私のスキーマではHABTM変数をテストします (元々 hasMany を使用していましたが、HABTM を使用したドキュメントを見つけましたが、やり過ぎに思えました)。
CakePHP フォームで複数選択を使用したいのですが、データの保存、取得、事前入力に問題が発生したくありません (つまり、beforeSave と beforeFind での醜い配列操作、選択したオプションを取得するための余分なクエリなど)。それは私がおそらく私よりも早く髪を失う原因になるかもしれません)。
1 つの使用例は、オプションが事前にわかっている複数選択であり、もう 1 つの使用例は、新しいオプションの作成と古いオプションの削除を許可する必要があります (私は select2 を使用しています)。
FormHelper ドキュメントを読んだときに欠落していたcake bake
いくつかのモデル HABTM ドキュメントの助けを借りて、
- 複数選択フォーム フィールドに、それに属するモデル、つまり Variable のような名前を付ける必要があります。
FormHelper のドキュメントでは暗黙的に示されていますが、間違いなくもっと強調される可能性があります。 - また、暗黙的: 操作はフィールドの可能な値を取得するため、Variable モデルで
find()
フィールドを呼び出す必要がありました(他に、入力呼び出しのモデル名から何を表示するかを知る方法はありません)。のオプションを変更できますが、それは別のステップで慣習を破ったと思います。id
name
find
- コントローラーで可能な値のリストを提供したい場合、一貫性がなく、小文字、キャメル化、および複数形の変数を設定する必要があります(モデルのように大文字や単数形ではなく、フォームフィールドに小文字ではなくアンダースコアを付ける必要があるように) -私の名前フィールドと私のテーブルのように分離された単数形)。
コントローラーで可能なオプションを設定する必要はないと思いました(それらを知っているか、ユーザーがオンザフライで追加したため、事前にDBにそれらを入力したくありません)、しかし、私は慣習に頭を悩ませようとしました。事前にDBにデータを入力してコントローラーに設定しない限り、動作させることができませんでした。
これは、単一選択の処理と比較して、壊れやすいか、少なくともより狭いようです。
私の継続的な問題
- HABTM では、その場で新しいオプションを作成することはできません (あるユースケースでは問題ありませんが、タグ付けに似た別のユースケースでは問題ありません)。
- HABTM では、DB にオプションを入力する必要はありません。そして、私は実際にはコントローラーでオプションを設定したくありませんが、ビューで設定します(これにより、1つのページで複数の「テスト」に問題が発生することが予想されるため、そうでない場合は問題ありません)。
- HABTM を使用すると、
Form->input
toを変更するとForm->select
機能しません (実際には問題ではありませんが、私のソリューションが脆弱であるという感覚が増します)。 - hasMany を使用すると、DB に入力した値を自動的に選択できるようになりましたが、関連付けを破棄または作成しません (つまり、依存として宣言されていても、子テーブルで選択されなくなったオプションを削除します)。ここでは、子テーブルのIDを適切に渡していないことが原因だと思いますが、それを行うCakeの方法はどうですか?
サンプルコード
/* Model Variable.php */
class Variable extends AppModel {
public $belongsTo = 'Test';
}
/* Model Test.php */
class Test extends AppModel {
public $belongsTo = 'Study';
public $hasAndBelongsToMany = array(
'Variable' => array(
'className' => 'variable',
'joinTable' => 'tests_to_variables',
'foreignKey' => 'test_id',
'associationForeignKey' => 'variable_id',
'with' => 'TestsToVariables',
),
);
}
/* in baked TestsController.php */
$variables = $this->Test->Variable->find('list');
$this->set(compact('variables'));
/* in edit.ctp, the baked view */
echo $this->Form->input('Variable');