在我的模式测试HABTM变量中(最初我使用 hasMany,但我发现更多使用 HABTM 的文档,即使它对我来说似乎有点过分)。
我想在 CakePHP 表单中使用多项选择,我不想在保存、检索和预填充数据时遇到麻烦(即 beforeSave 和 beforeFind 中的丑陋数组操作、用于检索所选选项的额外查询和其他事情这可能会导致我比我可能更早地脱发)。
一个用例是预先知道选项的多项选择,另一个需要允许创建新选项和删除旧选项(我正在使用 select2)。
当我阅读 FormHelper 文档时,借助cake bake
一些模型 HABTM 文档,我发现
- 我必须将我的多选表单字段命名为属于它的模型,即变量。
它隐含在 FormHelper 文档中,但绝对可以更突出显示。 - 也是隐含的:因为
find()
操作获取字段的可能值,所以我必须调用变量模型中的字段id
和name
(它如何从输入调用中的模型名称中知道要显示的内容)。我可以更改find
's 选项,但我认为这在其他步骤中打破了惯例。 - 不一致的是,如果我想在控制器中提供可能值的列表,我必须设置一个小写、驼峰化和复数形式的变量(不像我的模型那样大写和单数,就像我必须命名表单字段,而不是小写,下划线- 分隔和单数,如我的姓名字段和我的表格)。
我以为我不需要在控制器中设置可能的选项(因为我要么知道它们,要么它们是由用户即时添加的,我真的不想事先用它们填充数据库),但我试图绕开大会。除非我事先用它们填充数据库并将它们设置在控制器中,否则我无法让它工作。
与单一选择的处理相比,这似乎很脆弱或至少更狭窄。
我的持续问题
- 使用 HABTM,我无法即时创建新选项(对于一个用例可以,但对于另一个用例则不行,这更像是标记)。
- 使用HABTM,我不想用选项填充数据库。而且我真的不想在控制器中设置选项,而是在视图中设置选项(因为我预计这会导致一页上的多个“测试”出现问题,如果没有那么没关系)。
Form->input
使用HABTM,当我将其更改为时它不起作用Form->select
(并不重要,但增加了我的解决方案脆弱的感觉)。- 使用hasMany,我可以自动选择我在数据库中填写的值,但它不会破坏或创建关联(即删除子表中不再选择的选项,即使它被声明为依赖)。我认为这是由于这样一个事实,即我没有正确传递子表的 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');