我最近一直在尝试RDB设计,我想知道将项目存储在一个可以有多个值的字段中:
CARS Color_avail
1 corvette 1, 2, 3 <<<<<<<
2 ferrari 2
3 civic 1
COLORS
1 red
2 White
3 black
所以在CRUD上我想通过下拉/复选框或者包含多个值的东西添加多个项目。
答案 0 :(得分:2)
在昏迷分离列表中存储关系在某些意义上是有意义的。你不需要逗号。有2个现有的控件可以帮助您。
使用表单中的复选框显示值列表:
$form->addField('CheckboxList','corvette')->setValueList($array);
(你可以通过$ model-&gt; getRows()填充数组,虽然我认为它需要是关联的。你可以用var_dump和foreach加入它们。
您的其他选择是使用带有可选网格的隐藏字段。
$field = $form->addField('line','selection');
$grid = $form->add('MVCGrid');
$grid->setModel('Colors',array('name'));
$grid->addSelectable($field);
$form->addSubmit();
要隐藏实际字段,您可以使用“隐藏”代替“行”,也可以使用JavaScript隐藏它:
$field->js(true)->hide();
或
$field->js(true)->closest('dl')->hide();
如果你需要在字段周围隐藏标记。
答案 1 :(得分:2)
我可以看到在表单中显示这样的输出的好处,但是你真的想将它存储在数据库中吗?
例如,如果您的示例中包含逗号分隔列表的数据模型,您将使用哪种SQL来识别所有可用的白色汽车?
保持这样的多对多关系的传统方式是使用附加表格,例如你有一个单独的表,其中包含CAR_COLOUR以及以下内容
CAR COLOUR
1 1
1 2
1 3
2 2
3 1
所以现在你可以轻松查询诸如获取所有汽车和颜色的列表
SELECT CAR, COLOUR
FROM CARS CA,
COLOUR COL,
CAR_COLOUR CACOL
WHERE CA.CAR=CACOL.CAR
AND CACOL.COL=COL.COLOUR
如果您只想要白色汽车,请将以下内容添加到WHERE子句
AND COL.COLOUR='White'
对于id字段和CAR_COLOUR中的两个字段的索引将意味着即使您有数千行也能获得出色的性能,而将它们全部放在单个字段中的逗号分隔列表中意味着您必须使用substr或类似这将阻止索引的使用,并意味着随着数据量的增长,性能将迅速下降。